在 Visual Studio 中编译 gcc 代码会导致错误 C3646:"__attribute__":未知的覆盖说明符



我得到以下错误:

错误C3646: '__attribute__':未知的覆盖说明符

代码:

LEMUR_PREALIGN char _stack[ sizeof(_Type) * _Count ] LEMUR_POSTALIGN;

完全错误:

1>c:program filesindriindri 5.9includeindrigreedy_vector(52): error C3646: '__attribute__': unknown override specifier

附加信息:我正在尝试使用indri。

__attribute__命令是gcc特定于编译器的命令。它在该文件的第52行与((align))命令一起使用,其中:

为指定类型

的变量指定最小对齐方式(以字节为单位)

Visual studio实际上有一个类似的对齐命令:align。但是有两个问题:

  1. __declspec(align(#))不支持默认的:__attribute__ ((aligned))行为,将:

将类型对齐到您正在为之编译的目标机器的最大有用对齐方式

  • __declspec(align(#))是前缀。__attribute__((aligned(#)))是后缀。这意味着您的实际代码需要在位置上有所不同:
  • struct S { short f[3]; } __attribute__ ((aligned)); // gcc alignment definition __declspec(align(16)) strict S { short f[3]; }; // MSVC alignment

    这里的重点是,你可能会更好地使用#ifdef编译任何使用__attribute__ ((aligned))的行,并编写自己的__declspec(align(#))

    更多信息请参见:GCC vs MSVC类打包和对齐


    在对lemur_platform.h进行了更多的研究之后,看起来代码已经为您完成了上述所有工作!您将注意到#define LEMUR_POSTALIGN __attribute__ ((aligned))被包装在#ifndef WIN32中。所以你需要做的就是在你的Visual Studio项目中定义WIN32 !

    最新更新