在 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
。但是有两个问题:
__declspec(align(#))
不支持默认的:__attribute__ ((aligned))
行为将:
Align a type to the maximum useful alignment for the target machine you are compiling for
__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
!
我收到以下错误:
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
。但是有两个问题:
__declspec(align(#))
不支持默认的:__attribute__ ((aligned))
行为将:
Align a type to the maximum useful alignment for the target machine you are compiling for
__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
!