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

Compiling gcc code in Visual Studio causes error C3646: '__attribute__': unknown override specifier

我收到以下错误:

error C3646: '__attribute__': unknown override specifier

代码:

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

完全错误:

1>c:\program files\indri\indri 5.9\include\indri\greedy_vector(52): error C3646: '__attribute__': unknown override specifier

附加信息:我正在尝试在 Visual Studio 项目中使用 indri.lib。

__attribute__ 命令是针对 gcc 的编译器特定命令。并且用在this file with the ((align)) command的第52行,即:

Specifies a minimum alignment (in bytes) for variables of the specified type

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

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

Align a type to the maximum useful alignment for the target machine you are compiling for

  1. __declspec(align(#))是前缀。 __attribute__((aligned(#))) 是后缀。这意味着您的实际代码在位置上需要有所不同:

struct S { short f[3]; } __attribute__ ((aligned)); // gcc alignment definition __declspec(align(16)) strict S { short f[3]; }; // MSVC alignment

这里的要点是,编译器使用 __attribute__ ((aligned)) 并自己编写 __declspec(align(#)).

可能会更好 #ifdef

有关详细信息,请参阅:GCC vs MSVC class packing and alignment


进一步研究 lemur_platform.h 之后,代码似乎已经为您完成了上述所有工作!您会注意到 #define LEMUR_POSTALIGN __attribute__ ((aligned)) 包裹在 #ifndef WIN32 中。所以你需要做的是在你的 Visual Studio 项目中定义 WIN32