2017-02-27 12 views
0

GCCコンパイラの次のコンパイル時に驚いた。うまくいきました。コンパイラは警告のみを出します。Cのexternキーワードの振る舞い

warning: 'i' initialized and declared 'extern' [enabled by default] extern int i = 10;^

マイコード:

#include <stdio.h> 
//Compiler version gcc 4.9 
extern int i = 10; 
int main() 
{ 
    printf("%d\n",i); 
    return 0; 
} 

出力:

10 

なぜ与えるものではありませんコンパイラエラー?それは未定義の動作ですか?

+0

可能な複製http://stackoverflow.com/questions/496448/how-to-correctly-use-the-extern-keyword-in-c – 0xAX

答えて

-1

メイン関数本体はヘッダーではなく、.cファイルに入れてください。逆の場合は、externを.cファイルに入れてはならず、ヘッダーにのみ入れるべきです。それが宣言と定義の違いです。

Externは、この変数を認識させることを意味しますが、予約されるメモリはありません。コンパイラは今言う:あなたがこの変数を使用することを知っているが、実際に定義されていないことが約束されています。

とにかく、この変数を定義する可能性のある他のオブジェクト(その他の.cファイル)については、コンパイラは認識していません。したがって、実際にすべての変数を収集しようとするとリンカーにそれを保持します。

リンカが変数を他の場所で見つけられない場合、リンカは暗黙的に変数localを作成しますが、壊れたC標準について警告します。

+4

なぜ彼のメインがヘッダーにあると思いますか? – HolyBlackCat

+0

「extern」を使用しているためです。とにかくあなたは正しいですが、 'extern'宣言とともに.cファイル内にあるかもしれません。 – Psi