我正在构建一个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
Run Code Online (Sandbox Code Playgroud)
实现alloc_my_struct()是用C编译的.它只是简单地分配内存malloc()并初始化成员my_struct.
现在,当我在C++代码中执行以下操作时,
#include "my_struct.h"
...
my_struct *const ms = alloc_my_struct(2.);
Run Code Online (Sandbox Code Playgroud)
我注意到*ms总是有预期的内存布局,即任何访问,例如ms->z1评估到期望值.考虑到(CMIIW)my_struct分配期间的内存布局由C编译器(在我的情况下gcc -std=c11)决定,而在C++编译器访问期间(在我的情况下),我觉得这很酷g++ -std=c++11.
我的问题是:这种兼容性是否标准化?如果没有,有什么办法吗?
注意:我没有足够的知识来反对对齐,填充和其他实现定义的细节.但值得注意的是,经过C编译的GNU科学库正在实现相同的方法(尽管它们struct不涉及C99复数)用于C++.另一方面,我已经做了足够的研究,得出结论C++ 11保证了C99 double complex和C99之间的布局兼容性std::complex<double>.
C和C++共享内存布局规则.在两种语言中,结构以相同的方式放在内存中.即使C++确实想要做一些不同的事情,将结构放在内部也能extern "C" {}保证C布局.
但是你的代码在做什么依赖于C++ std :: complex和C99复合体是一样的.
所以看看: