このコードでは、i
という名前のリンケージを変更しようとしています。 C/C++では合法ですか?名前の連結を変更する
static int i = 2;
int i;
int main()
{
return 0;
}
このコードでは、i
という名前のリンケージを変更しようとしています。 C/C++では合法ですか?名前の連結を変更する
static int i = 2;
int i;
int main()
{
return 0;
}
は(あなたが複数定義のを持っています変数i
)、つまり、エラーメッセージを発行するために標準準拠コンパイラが必要です
$ 3.2.1(C++ 03)
No translation unit shall contain more than one definition of any variable, function, class type, enumeration type or template.
あなたのコードは未定義の動作を起動する
If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined.
C++では、間違った理由で正しい答えが得られます。問題は、問題の 'i'の両方の宣言が定義であり、それらのリンケージは無関係であるということです(ただし、内部的にも7.1.1/6でも同じ価値があります)。 'static int i = 2; extern int i; '(3.5/6)であり、' extern int i; static int i = 2; 'はあなたが与えた理由ではうまくないので、リンケージは一致しません。 –
@ Steve:Oops。あなたが正しいです。あなたのコメントに応じて私の投稿を編集しました。 –
CI号このエラーを取得:C++で
test.c:2: error: non-static declaration of ‘i’ follows static declaration
test.c:1: note: previous definition of ‘i’ was here
、これら:あなたのコードが悪い形成されているC++では
test.cpp:2: error: redefinition of ‘int i’
test.cpp:1: error: ‘int i’ previously defined here
Cでは実際はUBです。 :) –
@Prasoon:なぜgccがこのエラーを出すのですか? – sje397
未定義の動作とは**何か**が発生する可能性があることを意味します。これには、エラーメッセージを発行する実装が含まれます。 :) –
言う6.2.2/7ので、あなたはそれを試してみませんか? – sje397
C/C++とは何ですか? 。 –
@Charles CおよびC++。 –