2017-05-28 59 views
1

我有2 C文件在下面。從我讀的內容來看,我知道全局變量的默認存儲類是extern。如果我明確鍵入它,我得到未定義的變量錯誤。我在這裏錯過了什麼?這是否意味着當我省略extern關鍵字時,它就變成了一個定義,但是當我將它只輸入一個聲明時?C - 爲全局變量明確寫入extern關鍵字

file1.c中

#include <stdio.h> 
#include <stdlib.h> 
extern void file2function(); 

int variable; // if i put extern i will get error, isnt it implicitly extern? 

int main() 
{ 
    variable = 1; 
    printf("file1 %d\n",variable); 
    file2function(); 
    return 0; 
} 

file2.c中

#include <stdio.h> 
#include <stdlib.h> 

extern int variable; 


void file2function(){ 
    variable = 2; 
    printf("file2 %d\n",variable); 
    return; 
} 
+0

是的,除非你還提供初始化('extern int variable = 0;')。請參閱http://port70.net/~nsz/c/c11/n1570.html#6.9.2p4。請注意,C++對待它們的方式不同。 – PSkocik

+0

想一想如果你把所有的聲明都放在extern中,那麼應該在哪裏分配存儲空間?你無法區分唯一真正的定義。 – Jack

+0

所以我必須省略extern或者使用初始化工具來指出應該在哪裏分配存儲空間? – Splash

回答

4

You need to take a look at the difference between a definition and a declaration

這就是說,與extern存儲變量聲明是一個提示給編譯器的對象是在其他地方定義了(或翻譯單T)。這不是它自己的定義。

您需要在用於生成二進制文件的其中一個翻譯單元中進行定義。

在你的情況下,如果你把extern都放在這兩個文件中,int variable就成爲兩種情況下的聲明。這就是爲什麼在連接階段,編譯器找不到定義這是承諾,所以它尖叫。

在另一方面,如果去掉extern從一個文件(只有一個),在該文件中,int variable;定義和其他翻譯單元這個定義,所以,都好。

+0

謝謝你的解釋。正如你所說的,我們必須給編譯器一個提示。但是對於auto關鍵字「auto int a」陳述是一個定義,但「extern int a;」這只是一個減速?因爲「void function(){auto int a; printf(」%d「,a); return;}」不會給我任何錯誤。我希望我明白了嗎? – Splash

+0

@Splash:不要在C代碼中使用'auto'。閱讀存儲類和定義與聲明(使用鏈接Sourav給你)。 –

+0

@Splash yes,'extern'和'auto'是兩種不同的存儲類別說明符。 –