【发布时间】:2015-11-18 07:24:50
【问题描述】:
我正在构建一个 C++ 库,它使用许多函数,struct 在 C 库中定义。为了避免将任何代码移植到 C++,我将典型的条件预处理添加到 C 头文件中。例如,
//my_struct.h of the C library
#include <complex.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
double d1,d2,d3;
#ifdef __cplusplus
std::complex<double> z1,z2,z3;
std::complex<double> *pz;
#else
double complex z1,z2,z3;
double complex *pz;
#endif
int i,j,k;
} my_struct;
//Memory allocating + initialization function
my_struct *
alloc_my_struct(double);
#ifdef __cplusplus
}
#endif
alloc_my_struct() 的实现是用 C 编译的。它只是通过malloc() 分配内存并初始化my_struct 的成员。
现在,当我在 C++ 代码中执行以下操作时,
#include "my_struct.h"
...
my_struct *const ms = alloc_my_struct(2.);
我注意到*ms 始终具有预期的内存布局,即任何访问,例如ms->z1,都会计算为预期值。考虑到(如果我错了,请纠正我)分配期间my_struct 的内存布局由 C 编译器(在我的情况下为 gcc -std=c11)决定,而在 C++ 编译器访问期间(在我的案例g++ -std=c++11)。
我的问题是:这种兼容性是否标准化?如果没有,有什么办法可以解决吗?
注意:我没有足够的知识来反对对齐、填充和其他实现定义的细节。但值得注意的是,由 C 编译的 GNU 科学库正在实现相同的方法(尽管它们的 structs 不涉及 C99 复数)以用于 C++。另一方面,我已经进行了充分的研究,得出的结论是 C++11 保证了 C99 double complex 和 std::complex<double> 之间的布局兼容性。
【问题讨论】:
-
@Robᵩ: CMIIW = 如果我错了,请纠正我
-
这个问题更多的是关于
complex而不是struct。