Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按值传递的结构,在C->;期间损坏;C++;回调函数(gcc 4.1)_C++_C_Linux_Gcc_Callback - Fatal编程技术网

C++ 按值传递的结构,在C->;期间损坏;C++;回调函数(gcc 4.1)

C++ 按值传递的结构,在C->;期间损坏;C++;回调函数(gcc 4.1),c++,c,linux,gcc,callback,C++,C,Linux,Gcc,Callback,情况是这样的。我看到一个结构在被值传递到回调函数中时会被破坏,从C API到C++(通过静态方法)。 库A:基于C的API,通过gcc构建 库B:基于C++的API,通过g构建++ 库A构建为静态库,带有-fPIC。库B构建为共享库,链接库a,也使用-fPIC构建 在库A中定义的是一个结构: typedef结构 { uint32_t field1; uint32_t field2; 儿童结构1字段3; 儿童结构2字段3; }命中注定的结构; 和回调函数: typedef void(_CALLB

情况是这样的。我看到一个结构在被值传递到回调函数中时会被破坏,从C API到C++(通过静态方法)。 库A:基于C的API,通过gcc构建 库B:基于C++的API,通过g构建++

库A构建为静态库,带有-fPIC。库B构建为共享库,链接库a,也使用-fPIC构建

在库A中定义的是一个结构:

typedef结构
{
uint32_t field1;
uint32_t field2;
儿童结构1字段3;
儿童结构2字段3;
}命中注定的结构;
和回调函数:

typedef void(_CALLBACK_FUNC*函数)(uint32_t arg1,uint8_t arg2,
uint8_t arg3,结构arg4);

C++ API在类中定义了一个静态方法,并将其交给C API进行回调。当调用此回调时,简单类型的arg1、2、3可以正常工作,但结构中的字段是垃圾,每次执行时都会更改

<>我尝试将C++ API函数改为<代码>外部“C”<代码>静态函数,没有运气。

如果我在C API中删掉一个C函数并调用它只是为了测试,那么结构会被复制,不会损坏

令人沮丧的部分?这一切都可以在Linux和QNX上的MSVC8/9/10、GCC4.4.x(32位和64位)上正常工作。回到几年前的GCC4.1,这个弹出窗口

如果我将回调函数更改为通过指针而不是复制来传递结构,那么它可以正常工作!唉,C API有ABI限制,不能修改


它闻起来像是某种调用约定或结构布局问题,但我不知道这样的东西应该打开什么旋钮。总的来说,这个结构是16个字节,所以它不会对我提出堆栈问题。

这似乎与优化级别有关。代码是用-O0构建的,但失败了,现在用-O1就可以了。不想再深入挖掘了

这似乎与优化级别有关。代码是用-O0构建的,但失败了,现在用-O1就可以了。不想再深入挖掘了

你能看看库A和B的反汇编,看看它们是如何推动和解释结构的吗?是的,这是我调试的下一步。。。首先必须对x86 asm有一点了解。你能看看库a和B的反汇编,看看它们是如何推送和解释结构的吗?是的,这是我调试的下一步。。。首先要对x86 ASM有一点聪明。这听起来像是一种偏移结构,其中结构的C视图与结构的C++视图不同。看来4.1-land中有几个潜在的GCC错误可能与。。。老实说,我很高兴能蒙骗我们的价值观这听起来像是一种偏移结构,其中结构的C视图与结构的C++视图不同。看来4.1-land中有几个潜在的GCC错误可能与。。。老实说,我很高兴能蒙骗我们的价值观