我已经高度怀疑它可行而且没有风险,但我仍然想知道,所以这就是我的事......
我有一个C ++代码,它使用相当大的结构(15-30个字段)作为容器,作为类的构造函数的参数。具有这些结构的东西是我需要使用C99语法声明它们(与C ++ ffs不兼容):
FooBar fb = { .foo = 12, .bar = 3.4 };
因为有一个构造函数对我来说是不可想象的,因为在初始化这些结构时可以安全地跳过某些字段,而其他字段则不是,等等(它们仅由&#34完全初始化;用户提供& #34;数据,用户是我出现的情况),有点像他们描述了一个配置。
无论如何,重点是,我使用一个.h标头,使用普通的C语法声明结构,一个.c文件包含我初始化的结构,然后我可以在我的.cpp中访问它们使用extern" C"的文件。它运作良好......除了我能找到方便那些结构的方法。
所以我的问题是,是否可以像这样声明结构
#ifdef __cplusplus
// C++ compatible declarations with methods
struct foobar {
int foo;
float bar;
int method1();
int method2();
void method3();
[etc.]
};
#else
/* C compatible declarations, no methods */
struct foobar {
int foo;
float bar;
};
#endif
这样我可以在C ++中使用绑定到结构的一些方法(它更优雅,面向OOP),并且我可以使用C99的指定初始化器在我的C代码中安全地初始化它们。
我担心的是一些可能不为人知的问题,这些问题最终可能导致C代码中的结构错误与C ++代码不同。这些问题是否存在?
由于
答案 0 :(得分:1)
在C ++ 11中,如果struct
是标准布局,那么它的布局与等效的C结构相同。构成标准布局结构的规则如下:
A standard-layout class is a class that:
— has no non-static data members of type non-standard-layout class (or array of such types) or reference,
— has no virtual functions (10.3) and no virtual base classes (10.1),
— has the same access control (Clause 11) for all non-static data members,
— has no non-standard-layout base classes,
— either has no non-static data members in the most derived class and at most one base class with non-static data members, or has no base classes with non-static data members, and
— has no base classes of the same type as the first non-static data member.
由于您的结构只有一些公共数据成员和一些非虚方法,因此您的结构是标准布局。你可以用更少的重复来表达它
struct foobar {
int foo;
float bar;
#ifdef __cplusplus
int method1();
int method2();
void method3();
#endif
};
在C ++的早期版本中,您的类型必须是普通旧数据(POD)类型,并且还有一些限制。但是,你的结构仍然是POD(没有虚函数,没有构造函数或析构函数,没有基类),所以它仍然与C布局兼容。