2017-04-18 2 views
0

私はコンパイルに打ち鳴らす3.8.1を使用する場合:clang ++はいくつかの廃止予定の警告に対してextern "C"を無視していますか?

a.cpp:3:18: warning: 'register' storage class specifier is deprecated and incompatible with C++1z [-Wdeprecated-register] 
int foo(int x) { register int y = x; return y; } 
       ^~~~~~~~~ 

...内側の関数はCのコードであるので、私は本当に、取得すべきではありません。

extern "C" { 
int foo(int x) { register int y = x; return y; } 
} 

int main() { return foo(123); } 

を私が警告を受けます。 -WallでGCC 6.3.1を使用しても、私はこの警告を受け取りません。

これはクラッグバグですか、何か間違っていますか?

+0

これはCとは関係ありません! – Olaf

+2

コードはまだC++コードです! 'extern" C "'はABIと命名規則を指定するだけです。 (警告を読んだことがありますか?) – Olaf

+1

'extern" C "'は外部名のリンケージにのみ影響します。コンパイラを 'Cモード'に変更しません。 –

答えて

7

extern "C"は、「このコードをCとしてコンパイルする」という意味ではありません。これは、「Cコードからこの関数(または関数)を呼び出し可能にする」を意味します。これは、通常、名前の変更や場合によっては呼び出し規約の変更を意味します。

+1

これを見る別の方法は、** body **ではなく、 "この関数の** name **はCである"ということです。 –

+0

@JohnZwinck - それ以上の名前を含めることができます。 –

+1

@JohnZwinck:正確ではありません。それはまた、Cの呼び出し規約を暗示します。 – Olaf

0

おそらくエラーはextern "C"とは関係がありません。 "レジスタはCと互換性がありませんが、"レジスタはC++ 1zと互換性がありません "というメッセージが表示されます。 (私はC++ 1xはC++ 11/14/17を意味すると仮定します)

関連する問題