2017-01-17 24 views
0

次のコードを試したところ、エラーが発生しました。関数内でextern宣言を使用するとどうなりますか?

int main() 
{ 
    //this will cause redefinition error 
    extern int x; 
    int x=2; 
} 

私は、このような

When to use extern in C++

Defining extern variable in main() vs. globally

ようにexternについてのいくつかの答えを見て概念を得たが、私はまだ、コンパイラはこのケースで何をするのか疑問に思ってきました。一部の関数の中でexternを使用することはできますか?

更新:extern int xは単なる宣言であるため、

は具体的には、なぜ私がint xを定義することはできませんか?コンパイラはextern int xを定義として受け取りますか?それは使用することができます。もちろん、

+1

'はextern int型X 'でない上、より一般的な情報を提供します。静的格納期間で 'x'を宣言します。 'int x = 2;'自動保存期間、つまりエラーの原因となる 'x'を宣言しようとします –

+0

@MMあなたの意味を正確には理解していませんが、' static int x = 2 '' int x = 2'ではなく、エラーを返します。 – lionel

+0

それから、別のエラーで、異なるリンケージで 'x'を再宣言します –

答えて

0

but I am still wondering what does the compiler do in this case. Can extern be used(legal) inside some function?

を、しかし、あなたのコードを持っているとして、あなたは、変数を再宣言してはなりません。これは有効な例です:

int main() 
{ 
    //this will cause redefinition error 
    extern int x; 
    x=2; 
} 

int x; 
+0

なぜこれが再定義であるのか分かりません。 'extern'は単なる宣言です。 – lionel

+0

@lionelあなたは正しいです、その再宣言(私はそれを修正します)。 'int x = 2;'は宣言と定義の両方であるため、以前は 'extern int x;'が同じスコープ内にあった場合、 'int x = 2;'は再宣言になります。 – marcinj

+0

再宣言は問題にはなりません。変数は何度も宣言することができますが、C++ Primerにしたがって一度しか定義することはできません。 – lionel

0

、関数内で別のxを定義していない:それができる

int main() 
{ 
    extern int x; 
    x=2; 
} 
+0

これはリンクエラーを引き起こします。 int xは解決できません。 – lionel

+0

明らかに、別の翻訳単位でxを定義する必要があります。そうでない場合は、externを使用する目的は何ですか? –

+0

はい、この種のコードはわかりません。コンパイラがこの状況とその理由をどのように取り扱うのか不思議です。 – lionel

0

他の人が答えているように、はい、その名前の別の変数を宣言していない限り、関数内で使用できます。

あなたがリンクしている質問に対するdreamlaxのanswerの問題は、かなりうまく処理できます。コンパイラは、それがどのように使用されるかを知るために、型のもの以外の何かを行う/知る必要はありません。リンカーはそれがexternであり、実際に宣言されている場所を見つける必要があることを知ります。

This MSDNリンクは外部宣言と何MicrosoftはVS 2015

関連する問題