C和C++之间的内存布局兼容性

dow*_*ere 5 c c++

我正在构建一个C++库,它使用许多函数并structC库中定义.为了避免将任何代码移植到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>.

Zan*_*ynx 6

C和C++共享内存布局规则.在两种语言中,结构以相同的方式放在内存中.即使C++确实想要做一些不同的事情,将结构放在内部也能extern "C" {}保证C布局.

但是你的代码在做什么依赖于C++ std :: complex和C99复合体是一样的.

所以看看:

  • @AlexLop.如果这是真的,那意味着C和C++之间绝对没有互操作性.相反,C++标准花费了大量精力来强制执行POD类型的内存布局,即使没有打包结构,C/C++的互操作性也几乎得到了保证.出于同样的原因,使用`struct`的Linux系统调用可以在C和C++中使用,例如`stafs` http://man7.org/linux/man-pages/man2/statfs.2.html (5认同)