c++ - 将 C++ 结构传递给需要 C 结构的库

标签 c++ c linux struct

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

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

如何在 C++ 中创建一个 C 风格的结构来传递给库? (我不能传递一个对象)

最佳答案

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

How can I create a C style struct in C++?

代替

struct foo { /* ... */ };

使用

extern "C" {
    struct foo { /* ... */ };
}

这可能不会产生任何不同,即“C++ 风格结构”和“C 风格结构”通常是同一件事,只要您不添加方法、 protected 成员和位域。但是,由于函数需要“extern C”,因此将所有打算在 C 中使用的代码括在这些大括号中是合理的。

有关详细信息,请阅读:What is the effect of extern "C" in C++?和@AndrewHenle 的评论。


I ... need to use a library written in C

我正在解释 official C++ FAQ item在这里,告诉你(惊奇,惊奇)只在 extern C block 中包含库头,然后像编写 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);
}

关于c++ - 将 C++ 结构传递给需要 C 结构的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49723361/

相关文章:

c++ - QGraphicsScene 中的 QGraphicsView 大小

php - 尝试使用 C 向本地服务器发送 POST 请求

c - gcc: "="标记之前的预期表达式

Mysql datetime DEFAULT CURRENT_TIMESTAMP错误

java - 将域映射到 Tomcat 应用程序

c++ - 解析灵气中双大括号修饰字符串的规则语法

c++ - boost::asio 如何确定要连接到哪个端口?

c++ - 编写 move 复制和 move 赋值构造函数的有效方法

c - OSX/Ubuntu/Soliars 上的信号量行为不同,线程执行超出 sem_wait()

linux - 水平连接所有文件且仅连接特定列