通过C&x2B+;结构到库,需要C结构 我在Linux写C++程序,需要使用C中编写的旧库。库使用C结构来传递函数中的信息,这些结构是字节对齐的(不填充)。 我的理解是C++中的一个结构实际上是一个对象,而C中的一个结构只是一个内存块,它被分成单独的可寻址的块。 如何在C++中创建C样式结构传递给库?(我无法传递对象)

通过C&x2B+;结构到库,需要C结构 我在Linux写C++程序,需要使用C中编写的旧库。库使用C结构来传递函数中的信息,这些结构是字节对齐的(不填充)。 我的理解是C++中的一个结构实际上是一个对象,而C中的一个结构只是一个内存块,它被分成单独的可寻址的块。 如何在C++中创建C样式结构传递给库?(我无法传递对象),c++,c,linux,struct,C++,C,Linux,Struct,你在这里问了两个问题,真的 如何在C++中创建C样式结构?< /p> 而不是 struct foo { /* ... */ }; 使用 这可能不会导致任何不同,即“C++样式结构”和“C样式结构”通常是相同的,只要不添加方法、受保护的成员和位字段。然而,由于函数需要“externC”,所以在这些大括号中包含所有打算在C中使用的代码是合理的 有关更多详细信息,请阅读:和@AndrewHenle的评论 我。。。需要使用C语言编写的库吗 我在这里解释一个,告诉你(惊喜,惊喜)只需将库头包含在一个e

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

<>如何在C++中创建C样式结构?< /p> 而不是

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

这可能不会导致任何不同,即“C++样式结构”和“C样式结构”通常是相同的,只要不添加方法、受保护的成员和位字段。然而,由于函数需要“externC”,所以在这些大括号中包含所有打算在C中使用的代码是合理的

有关更多详细信息,请阅读:和@AndrewHenle的评论


我。。。需要使用C语言编写的库吗

我在这里解释一个,告诉你(惊喜,惊喜)只需将库头包含在一个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);
}

因此,这个问题有一些与之相关的复杂问题。但是,从一级近似来看,答案很简单

<>任何C代码>结构> /COD>声明,将被C编译器和C++编译器所接受(它们大部分是由C编译器接受的)将是一个“。”这是C++标准中定义的概念,C++编译器应该以某种方式对待它们。

特别是符合C++编译器的一个子集的C编译器,应该具有与此类型完全相同的内存表示。

对于Linux和Windows,ABI对于C和C++都是非常仔细的定义,现在已经有5-10年了。任何一个平台上的所有编译器都应该符合它。这对于任何普通的C和C++编译器组合都是正确的。这包括Clang、g++、visualstudio,以及几乎所有在该平台上工作的非高度专业化的编译器。这并不一定意味着标准C++库的不同版本具有兼容的实现,因为(例如)<>代码::STD::String 已经实现了多年(因此,在字符串结构中实际上是什么数据)尽管公共界面没有太大变化,但已经发生了巨大的变化

< C++ > ABI因多种因素而复杂。其中包括异常处理和函数名篡改(对函数的链接器符号名中的函数参数类型进行编码)约定。此外,由于在许多情况下类型默认为
int
以及其他问题,C很大程度上要求调用方在函数完成后将参数从堆栈中弹出,因为被调用函数无法真正确定推送的参数的大小。C++具有更严格的类型检查,并且在一段时间内,这导致了一个“调用函数弹出参数”调用约定。我认为这种情况已经不复存在了,因为我认为它的效率更低。不过我可能错了

现在,如果您开始使用特定于编译器的关键字,如“packed”或“aligned”,所有这些都将消失。然后,您应该仔细查阅文档以了解发生了什么

人们提到了一个
外部“C”
声明。这些对于C和C++代码之间的接口非常重要,但是它们与<代码>结构> /COD>布局无关,并且根本不需要这样做。声明“函数名和调用约定符合C abi而不是C++ abi”是什么意思。这是关于调用方是从堆栈中弹出函数调用参数还是被调用函数弹出参数,函数名如何转换为链接器要使用的符号,顺序参数推送到堆栈上,等等。同样,结构在内存中的布局与
extern“C”
没有任何关系。这种构造完全是关于函数的,而不是关于结构的

再重复一遍,这里有很多复杂性。但在绝大多数情况下,你根本不需要担心。它会起作用的

<>我的理解是C++中的一个结构实际上是一个对象,而C中的一个结构只是一个内存块,它被分成单独的可寻址的块。 你刚才用不同的词描述了几乎完全相同的事情

由于两种语言的语法重叠,您通常可以使用
struct
关键字定义一个简单的类,并使用C编译器编译相同的定义

此外,通常可以将指针从C++程序传递给用户定义类型的对象,转换成C程序。但是,您通常需要将定义包装在

extern“C”
中,以便告诉计算机您需要这种兼容性


最后,记住C++中的关键字<代码>类< /COD>和关键字<代码>结构> /COD>都引入类定义,所以C++没有真正的“结构”,但是在C中它们绝对是一个东西(而类不是)。因此,只需对术语稍加小心。

您的理解是错误的。C和C++中的结构基本相同。C中定义的结构将在C++中编译和链接。如果结构成员在C结构中有效,则它们是等效的。例如,添加虚拟函数会使结构不兼容。我只能猜测“实际对象”对您意味着什么。不管它是什么,它不适用于C++。C++类(由<代码>结构St/代码>声明为A)
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);
}