C和C ++代码互操作性 - 数据传递问题

时间:2011-10-21 01:24:19

标签: c++ c interop

以下是这种情况。有一个完全用C语言编写的系统/软件。这个C程序产生一个新线程来启动某种用C ++编写的数据处理引擎。因此,我拥有的系统运行2个线程(主线程和数据处理引擎线程)。现在,我在C中编写了一些函数,它接受一个C结构并将其传递给数据处理线程,以便C ++函数可以访问C结构。在这样做时,我观察到C语言中的某些字段(如unsigned int)的值在C ++中被访问时会发生变化,我不知道为什么。同时,如果我传递一个像int这样的原始数据类型,则该值不会改变。如果有人能解释我为什么会这样做,那就太好了。以下是我写的代码。 `

/* C++ Function */
void DataProcessor::HandleDataRecv(custom_struct* cs)
{
  /*Accesses the fields in the structure cs - an unsigned int field. The value of   
    field here is different from the value when accessed through the C function below.
   */
}

/*C Function */
void forwardData(custom_struct* cs)
{
  dataProcessor->HandleDataRecv(cs); //Here dataProcessor is a reference to the object 
                                     //of the C++ class.
}

` 此外,这两个函数都在不同的源文件中(一个带有.c ext,另一个带有.cc ext)

4 个答案:

答案 0 :(得分:3)

我会检查双方是否在同一个

中布局结构
  • 以两种语言打印sizeof(custom_struct)
  • 在两种语言中创建custom_struct的实例并打印偏移量 每个成员变量。

答案 1 :(得分:1)

我的猜测是Michael Andresson是对的,结构对齐可能是问题。

尝试使用

编译c和c ++文件
-fpack-struct=4

(或4的其他数字)。这样,结构在每种情况下都是相同的。

如果我们能看到结构声明,它可能会更清晰。该结构不包含任何带有c ++特定代码的#ifdef,如构造函数,是吗?另外,检查操作数据对齐的#pragma pack指令。

答案 2 :(得分:0)

(更正)除了少数例外,C ++是C的超集(意思是C89),所以我对正在发生的事情感到困惑。我只能假设它与你如何传递或输入变量和/或它们运行的​​系统有关。从技术上讲,它应该除非我非常错误,否则与c / c ++互操作性无关。

更多细节会有所帮助。

答案 3 :(得分:0)

也许在一方面,结构中添加了“空字节”,使变量在32位边界上对齐以提高速度(因此CPU寄存器可以直接指向变量)。

另一方面,结构可以打包以节省空间。