我在动态链接 DLL 的函数中使用来自 NI LabWindows 应用程序的指针时遇到问题。
- DLL 是使用 MinGW 4.7 构建的
- 据我所知,NI LabWindows 使用具有 C89 标准和 C90 扩展的非常古老的 LLVM CLang ANSI C 编译器
当调用特定的 DLL 函数时,我使用指向结构的指针。问题是,LabWindows 应用程序给出的指针指向的内存位置比 DLL 期望它们指向的内存位置提前 1 个字节。
所以到目前为止我讨厌的解决方案如下:
int MyFunction(MyStruct* struct) {
char *ptr = (char*) struct;
ptr--;
struct = (MyStruct*) ptr;
// do stuff
ptr = (char*) struct;
ptr++;
struct = (MyStruct*) ptr;
return 0;
}
我的问题是:为什么???有没有更复杂的解决方案?
我希望像指针这样的基本概念不会因编译器而异,但可能 LabWindows 使用的那个概念太旧了。
编辑:解决方案是为编译器声明结构的正确方式并指定填充和对齐。因此,适用于两种编译器的正确结构定义是:
#pragma pack(2)
typedef struct MyStruct{...};