2015-10-08 34 views
2

在下面的代碼中,我從file2.c中var10的變量聲明中刪除了詞extern我期待在兩個文件中的變量var10是相互獨立的,並且都有文件範圍當extern不在其中一個文件中使用時。但結果是10和34,而不是我所期望的10和10。所以我們不能使用文件作用域而不使用靜態關鍵字?爲什麼在兩個變量的作用域相同的情況下我們不會得到多重定義錯誤?我用codeblcoks + MinGW的變量與C中的文件範圍沒有靜態關鍵字

file1.c中

#include <stdio.h> 
int var10; 

int main (void) 
{ 
    var10=10; 
    printf("Var10 before function call=%d\n",var10); 
    var10TestFunc2(); 
    printf("Var10 after function call=%d\n",var10); 
} 

file2.c中

#include<stdio.h> 

int var10; 
void var10TestFunc2(void) 
{ 
    var10 = 34; 
} 
+0

'定義'vs'聲明' –

回答

1

全局變量,不會有靜態默認情況下,全球範圍內。在這裏你已經定義了相同的變量(沒有初始化)。一個被認爲是定義,另一個被編譯器聲明。

如果使用定義中的兩個不同值初始化變量。它會導致鏈接器錯誤。

+1

這不是關於範圍,而是關係。兩者都是可以定義的定義_。使用初始化程序會初步定義一個正常的定義,如果有兩個具有相同名稱的正常定義的文件,則會出現錯誤。 (注意:初始化程序的不同與否無關)。 – Olaf

+0

@Olaf你是對的! – sreeyesh