编译器特定的指针?

Compiler specific pointers?

我在动态链接 DLL 的函数中使用 NI LabWindows 应用程序的指针时遇到问题。

调用特定的 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{...};

现在一切都很顺利:-)