2010-05-26 106 views
3

內容X.c多重聲明和定義

內容 Y.c
int i; 
main() 
{ 
fun(); 
} 

int i; 
fun() 
{ 
} 

爲什麼這兩個文件編譯沒有錯誤? (使用GCC)

但是,如果我使用int i = 10;它打印多重定義錯誤。

+0

[c&C++默認全局變量鏈接,多重聲明和定義問題]的可能重複(http://stackoverflow.com/questions/6371048/cc-default-global-variable-linkage-multiple-declaration-definition- probl) – legends2k 2014-03-03 12:00:43

回答

-1

因爲聲明和定義之間有區別。 int i;無非是介紹一個名字。另一方面,int i = 10;定義爲i,因此,必須保留存儲器中的位置以存儲其對應的值。但編譯器無法知道哪個值對應於i,因爲您想將兩個內存位置與名稱i關聯。

這是假設你將這些文件與海誓山盟聯繫起來的,這在你的解釋中並不完全清楚。

+5

不,「int i;」也是一個定義。 – paxdiablo 2010-05-26 10:02:01

+0

的確,我誤解了他的例子,我很抱歉。 – Pieter 2010-05-26 10:06:39

+0

我很困惑,這是定義嗎? – Pointer 2010-05-26 11:35:30

1

假設你真的想要一個獨立變量叫我在每一個這兩個文件,你需要爲了與static前綴他們,給他們internal linkage.

static int i = 10; 

如果你想我在兩個文件中都是相同的變量,所以一個文件中的變化會影響另一個文件,當你問這個問題的一個變體時,使用你的答案是given 3 hours ago。如果要共享,則需要在一個地方定義變量。

至於爲什麼它沒有在沒有init的情況下沒有導致錯誤,我認爲這是因爲在你需要初始化並且編譯器忽略它之前你沒有使用這個變量。