gpt4 book ai didi

带方法的 C++ 结构,不带方法的 C 声明

转载 作者:行者123 更新时间:2023-11-28 06:04:43 25 4
gpt4 key购买 nike

我已经高度怀疑它是可行的并且根本没有风险,但我仍然想确定地知道,所以这是我的事情......

我有一个 C++ 代码,它使用相当大的结构(15-30 个字段)作为容器,作为类构造函数的参数。这些结构的问题是我需要使用 C99 语法声明它们(与 C++ ffs 不兼容):

FooBar fb = { .foo = 12, .bar = 3.4 };

因为我无法想象拥有构造函数,因为在初始化这些结构时可以安全地跳过某些字段,而其他字段则不能,等等(它们仅由“用户提供”数据专门初始化,用户是我发生),有点像他们描述的配置。

无论如何,指出一点,我要使用一个 .h header ,它使用纯 C 语法声明结构,一个 .c 文件包含我初始化的结构,然后我使它们在我的 .cpp 文件中使用外部“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++ 中使用一些绑定(bind)到结构的方法(它更优雅,面向 OOP),并且我可以使用 C99 的指定初始化器在我的 C 代码中安全地初始化它们。

我担心的是一些我可能不知道的问题,这些问题最终可能导致 C 代码中的结构偏移与 C++ 代码中的不同。这些问题是否存在?

谢谢

最佳答案

在 C++11 中,如果您的 structstandard-layout,那么它与等效的 C struct 具有相同的布局。构成标准布局结构的规则如下:

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.

由于您的结构只有几个公共(public)数据成员和一些非虚拟方法,因此您的结构是标准布局。你可以用更少的重复来表达它

struct foobar {
int foo;
float bar;
#ifdef __cplusplus
int method1();
int method2();
void method3();
#endif
};

在以前的 C++ 版本中,您的类型必须是普通旧数据 (POD) 类型,并且有更多限制。但是,您的结构仍然是 POD(没有虚函数、没有构造函数或析构函数、没有基类),因此它仍然与 C 布局兼容。

关于带方法的 C++ 结构,不带方法的 C 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com