初始化 c 风格的结构

Posted

技术标签:

【中文标题】初始化 c 风格的结构【英文标题】:Initialising c-style structs 【发布时间】:2012-01-23 14:16:28 【问题描述】:

我有一个头文件,它定义了要通过 c++ DLL 边界传递的 c 样式结构。这个头文件和 DLL 可能会被 c++、java 和 c 应用程序使用。我想以某种方式初始化这些结构,允许用户指定参数的子集,其余的将被赋予默认值。

我正在考虑在标头中创建一系列初始化函数,这些函数将引用它们将初始化的结构以及可以设置的所有成员的参数。 “初始化”函数将使用重载(基于传入的结构引用)来确保调用正确的函数。我还计划使用默认参数来设置默认值。我猜这些功能必须是全局的。

这是一个好方法吗?有更好的选择吗?谢谢

【问题讨论】:

C 不支持方法重载。您必须为 C API 使用不同的函数名称,或者以其他方式将所有函数抽象到具有相同参数列表的单个函数后面。您可能还会发现 this question 很有帮助。 您可以在头文件中添加函数原型,但最好将实际函数放在源文件中。还要记住将函数声明为extern "C",这样C++ 就不会破坏它们的名称。除此之外,这不是一个坏方法。 @Joachim,谢谢,我想把实现放在头文件中,这样 DLL 的任何第三方都可以使用它们,这合理吗? 第三方仍然可以链接到您的“图书馆”。如果将函数放在标题中,还必须将它们设置为 inline,否则在链接时可能会出现多个定义错误。 如果结构应该由第 3 方编译,我怀疑您将不得不以某种方式解决对齐问题。 DLL 内的结构不一定使用与调用 DLL 的应用程序中编译的结构相同的对齐方式。 #pragma pack 或类似的可能有用。 【参考方案1】:

您可以添加一个返回默认初始化结构的函数:

struct abc

  int a;
  float b;
  char c;
;

abc GetDefaultAbc()

  const abc def =  1,2.0,3 ;
  return def;
;

【讨论】:

以上是关于初始化 c 风格的结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中部分初始化一组 C 结构?

c++ c风格零初始化0

C++ 指针和 C 风格的数组初始化

Objective - C 直接初始化(对于 Cocos2D 风格的动作)

在 Swift 中使用 const char * 初始化 C-struct

如何正确初始化 C++11 中的数据成员?