【问题标题】:Compiler specific pointers?编译器特定的指针?
【发布时间】:2017-01-27 07:07:07
【问题描述】:

我在动态链接 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{...};

【问题讨论】:

    标签: pointers dll mingw labwindows


    【解决方案1】:

    好的,我解决了我的问题!所有奇怪行为的原因是内存管理。对齐和填充不同!所以在声明我的结构为打包后

    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) 指令,但最终的解决方案是将其全部更改为两字节对齐并删除除编译指示以外的所有内容:

    #pragma pack(2)
    typedef struct MyStruct{...};
    

    现在一切都像一个魅力:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多