编译器特定的指针?
Compiler specific pointers?
我在动态链接 DLL 的函数中使用 NI LabWindows 应用程序的指针时遇到问题。
- DLL 是使用 MinGW 4.7 构建的
- NI LabWindows 使用了一个非常古老的 LLVM CLang ANSI C 编译器,据我所知,它具有 C89 标准和 C90 扩展
调用特定的 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{...};
好的,我的问题解决了!所有奇怪行为的原因是内存管理。对齐和填充是不同的!所以在将我的结构声明为 packed
之后
typedef struct __attribute__(packed) MyStruct{ ...};
问题没有解决,我尝试了
typedef struct __attribute__(packed,align(1)) MyStruct{...};
也不是解决方案,因此我为 LLVM CLang 编译器添加了#pragma pack(1)
#pragma pack(1)
typedef struct __attribute__(packed,align(1)) MyStruct{...};
我不知道为什么,但 LLVM 编译器不会遵循 pack(1) 指令,但最终的解决方案是将其全部更改为 two-byte-alignment 并删除除 pragma 之外的所有内容:
#pragma pack(2)
typedef struct MyStruct{...};
现在一切都很顺利:-)
我在动态链接 DLL 的函数中使用 NI LabWindows 应用程序的指针时遇到问题。
- DLL 是使用 MinGW 4.7 构建的
- NI LabWindows 使用了一个非常古老的 LLVM CLang ANSI C 编译器,据我所知,它具有 C89 标准和 C90 扩展
调用特定的 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{...};
好的,我的问题解决了!所有奇怪行为的原因是内存管理。对齐和填充是不同的!所以在将我的结构声明为 packed
之后typedef struct __attribute__(packed) MyStruct{ ...};
问题没有解决,我尝试了
typedef struct __attribute__(packed,align(1)) MyStruct{...};
也不是解决方案,因此我为 LLVM CLang 编译器添加了#pragma pack(1)
#pragma pack(1)
typedef struct __attribute__(packed,align(1)) MyStruct{...};
我不知道为什么,但 LLVM 编译器不会遵循 pack(1) 指令,但最终的解决方案是将其全部更改为 two-byte-alignment 并删除除 pragma 之外的所有内容:
#pragma pack(2)
typedef struct MyStruct{...};
现在一切都很顺利:-)