将C++结构传递给期望C结构的库

TSG*_*TSG 3 c c++ linux struct

我正在Linux中编写一个C++程序,需要使用用C编写的旧库.库使用C结构将信息传入和传出函数,这些结构是字节对齐的(无填充).

我的理解是C++中的结构实际上是一个对象,而C中的结构只是一个内存块,被分成可单独寻址的部分.

如何在C++中创建C样式结构以传递给库?(我不能传递一个对象)

ein*_*ica 5

你在这里问两个问题,真的......

如何在C++中创建C样式结构?

代替

struct foo { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

使用

extern "C" {
    struct foo { /* ... */ };
}
Run Code Online (Sandbox Code Playgroud)

这可能不会导致任何不同,即"C++样式结构"和"C样式结构"通常是相同的,只要您不添加方法,受保护的成员和位字段.但是,由于函数需要"extern C",所以在这些大括号中包含所有用于C的代码是合理的.

有关更多详细信息,请参阅:外部"C"在C++中的作用是什么?和@AndrewHenle的评论.


我...需要使用用C编写的库

我在这里解释一个正式的C++ FAQ项目,告诉你(惊讶,惊讶)只是在一个extern C块中包含库头,然后像你编写C一样使用它中的任何内容:

extern "C" {
  // Get declaration for `struct foo` and for `void f(struct foo)`
  #include "my_c_lib.h"
}

int main() {
    struct foo { /* initialization */ } my_foo;
    f(my_foo);
}
Run Code Online (Sandbox Code Playgroud)

  • @Omnifarious*这是错误的信息.`extern"C"`与`struct`布局完全无关.*不完全正确.有方法.`struct`的某些部分可以是实现定义的(位字段),并且在C++代码中使用C`struct`很可能是通过不同的实现来完成的,特别是当它类似于"旧库"时.题.FWIW,我还遇到过这样的情况:库和调用应用程序之间的不同编译器优化选项导致了不同的`struct`布局.想象一下用GCC和`-fpack-struct`编译库. (2认同)