2016-05-18 10 views
1

私は組み込みプラットフォーム用にコンパイルしているコードをいくつか持っています。コードに対してClangベースのツールを実行しようとすると、いくつかのエラーが発生します。なぜ「以前の宣言指定子と結合できないのですか」

私は次のようにエラーを生成するコードを絞り込んいる

typedef int _GCC_ATTR_ALIGN_8t __attribute__((__mode__(__QI__))); 
typedef _GCC_ATTR_ALIGN_8t _Int8t __attribute__((__aligned__(1))); 
typedef _Int8t _Intleast8t; 
typedef _Int8t _Intfast8t; 
typedef _Int8t _int8; 
typedef _Int8t int8_t; 

コードに対して打ち鳴らす3.8.0を実行しているからの出力は次のとおりです。

x.cpp:5:16: error: cannot combine with previous 'type-name' declaration 
     specifier 
typedef _Int8t _int8; 
      ^
x.cpp:5:1: warning: typedef requires a name [-Wmissing-declarations] 
typedef _Int8t _int8; 
^~~~~~~~~~~~~~~~~~~~ 
1 warning and 1 error generated. 

なぜそれが持っていません他のtypedefではなく、_int8 typedefでのみ発行されますか?また、エラーはどういう意味ですか?

+2

'_int8'はおそらくすでにどこかの型に定義されています。私はこれをワンドボックスで再現することはできません。 –

+0

Visual Studio 2015を使ってWindows 10にClang 3.8.0をビルドしました。 'clang.exe x.cpp'を使ってコンパイルしました。 – Graznarak

+1

アンダースコアと大文字で始まる識別子は、実装によって予約されています。問題のコードがコンパイラ/ベンダーによって提供されていない限り、間違っています。詳細については、http://stackoverflow.com/a/228797/845568を参照してください。 –

答えて

4

WindowsのClangは、デフォルトでは-fms-extensions、そのモードでは_int8 is a keyword equivalent to charとなっています。これは明らかにMSVCの機能です。

-fno-ms-extensionsで無効にします。

関連する問題