2010-12-01 17 views
7

このコードでは、iという名前のリンケージを変更しようとしています。 C/C++では合法ですか?名前の連結を変更する

static int i = 2; 
int i; 

int main() 
{ 
    return 0; 
} 
+2

言う6.2.2/7ので、あなたはそれを試してみませんか? – sje397

+6

C/C++とは何ですか? 。 –

+3

@Charles CおよびC++。 –

答えて

10

は(あなたが複数定義のを持っています変数i)、つまり、エラーメッセージを発行するために標準準拠コンパイラが必要です

C99では

$ 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.

+2

C++では、間違った理由で正しい答えが得られます。問題は、問題の 'i'の両方の宣言が定義であり、それらのリンケージは無関係であるということです(ただし、内部的にも7.1.1/6でも同じ価値があります)。 'static int i = 2; extern int i; '(3.5/6)であり、' extern int i; static int i = 2; 'はあなたが与えた理由ではうまくないので、リンケージは一致しません。 –

+0

@ Steve:Oops。あなたが正しいです。あなたのコメントに応じて私の投稿を編集しました。 –

1

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

+4

Cでは実際はUBです。 :) –

+0

@Prasoon:なぜgccがこのエラーを出すのですか? – sje397

+1

未定義の動作とは**何か**が発生する可能性があることを意味します。これには、エラーメッセージを発行する実装が含まれます。 :) –

関連する問題