2017-02-27 86 views
0

我在GCC編譯器上編譯後面的程序時感到驚訝。它成功地工作。編譯器只給出警告。extern關鍵字在C中的行爲

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文件中,而只能放在標題中。這是聲明和定義之間的區別。

外部手段,使這個變量已知,但沒有內存要爲它保留。編譯器現在說:好吧,我知道你想要使用這個變量,但它只承諾在那裏,沒有實際定義。

編譯器無論如何不知道可能定義這個變量的其他對象(其他.c文件)。所以它保持鏈接器實際嘗試收集所有變量。

如果鏈接器現在沒有在其他地方找到該變量,它會隱式地使變量爲局部變量,但會警告有關C標準的破壞。

+4

你爲什麼認爲他的'main'是在頭部? – HolyBlackCat

+0

由於使用'extern'。無論如何,你是對的,它也可能與'extern'聲明一起在一個.c文件中。 – Psi