繁体   English   中英

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

[英]Struct passed by value, corrupted during C -> C++ callback function (gcc 4.1)

情况就是这样。 我看到一种结构,当它按值传递给回调函数时,结构从C API到C ++(通过静态方法)损坏。

库A:通过gcc构建的基于C的API库B:通过g ++构建的基于C ++的API

库A使用-fPIC构建为静态库。 库B是作为共享库构建的,它链接库A,也通过-fPIC构建。

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

typedef struct doomed_struct
{
    uint32_t field1;
    uint32_t field2;
    CHILD_STRUCT1 field3;
    CHILD_STRUCT2 field3;
} DOOMED_STRUCT;

和一个回调函数:

typedef void (_CALLBACK_FUNC *FUNCTION)(uint32_t arg1, uint8_t arg2,
    uint8_t arg3, DOOMED_STRUCT arg4);

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

我尝试过将C ++ API的功能也更改为extern "C"静态功能,但没有运气。

如果我在C API中存根一个C函数并调用它只是为了进行测试,则该结构将被复制而不会损坏。

令人沮丧的部分? 在MSVC8 / 9/10,Linux和QNX上的gcc 4.4.x(32位和64位)上,这些都可以正常工作。 回到几年前到gcc 4.1,这弹出。

如果我更改回调函数以通过指针而不是通过副本传递结构,则可以正常工作! C,C API具有ABI限制,无法修改。

闻起来像是某种调用约定或结构布局问题,但我不知道该为什么样的旋钮转动。 总体而言,该结构为16字节,因此它不会对我造成尖叫。

这似乎与优化级别有关。 代码是使用-O0生成的,但是失败了,现在使用-O1可以正常工作。 没兴趣进一步挖掘!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM