在Visual Studio中编译gcc代码会导致错误C3646:' __ attribute __&#39 ;:未知的覆盖说明符

时间:2015-10-03 13:27:57

标签: c++ visual-studio gcc msvc12

我收到以下错误:

  

错误C3646:' __ attribute __':未知覆盖说明符

代码:

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

完成错误:

  

1> c:\ program files \ indri \ indri 5.9 \ include \ indri \ greedy_vector(52):错误C3646:' __ attribute __&#39 ;:未知覆盖说明符

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

1 个答案:

答案 0 :(得分:2)

__attribute__命令是gcc的编译器特定命令。它在this file的第52行和((align)) command上使用,其中:

  

指定指定类型

的变量的最小对齐(以字节为单位)

Visual Studio确实有一个类似的对齐命令:align。但有两个问题:

  1. __declspec(align(#))不支持违约:__attribute__ ((aligned))行为:
  2.   

    将类型与要编译的目标机器的最大有用对齐方式对齐

    1. __declspec(align(#))是前缀。 __attribute__((aligned(#)))是后缀。这意味着您的实际代码需要在展示位置上有所不同:
    2. 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 class packing and alignment

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