2011-11-14 41 views
5
#include<stdio.h> 
int x=13; // forcing space allocation 
int x; 
int main(){ 
    printf("%d\n",x); 
} 

上面的代碼編譯但下面的代碼沒有。爲什麼?錯誤:沒有鏈接的重新聲明

#include<stdio.h> 
int main(){ 
    int x=13; // forcing space allocation 
    int x; 
    printf("%d\n",x); 
} 

我被告知int x;可以由編譯器根據上下文解釋爲聲明或定義。我可以看到,在第一種情況下(全球一),但第二種情況發生。

回答

4

Quoting:

你不能在C程序中的兩個同名的全局變量。 C 可能允許在同一文件範圍內通過 tentative definition rule的多個定義,但是在任何情況下,所有定義都將引用 到相同的變量。

+0

我同意你的意見。但爲什麼不同樣的事情適用於局部變量。我的事情我失去了一些非常明顯的東西。請指出正確的方向 – Bazooka

+0

您只能對具有文件範圍的變量進行初步定義,而不能對局部變量進行初步定義。 –

0

因爲不能聲明兩次具有相同名稱的局部變量。根本不要那樣做。

它適用於全局的編譯器,因爲編譯器將其視爲forward declaration,這當然不能用於堆棧變量。

請注意,只有當沒有賦值時,它纔可以全局工作。

+1

它適用於全局變量。爲什麼不能用於自動類型? – Bazooka

+0

你稱自動類型是什麼? – Macmade

+0

請參閱編輯... – Macmade

0

從您的評論在繼續:「可以請你詳細說明前聲明」 ......

遠期聲明是正是他們聽起來像。將在其他地方(通常在後面)定義一個聲明。這個概念僅適用於全局符號。在生成的二進制文件中只能有一個全局符號的定義。但是,您可以在源代碼中一次又一次地聲明它們,以便在編譯階段可以引用它們。

這些符號成爲彙編中的定義,然後在鏈接階段使用它們將所有內容鏈接在一起。

頭文件是在代碼中其他地方(稍後)定義的前向聲明的常用示例。

本地(自動)變量不會轉換爲符號。所以當你說類似

int x; 
int x; 

在相同的範圍內編譯器不允許它,因爲它是無意義的。局部變量只是指向函數棧幀中特定位置的便利。其定義邊界位於範圍標記{}之內。

頭文件本質上是全局變量和函數的「前向聲明」看到這個爲你的struct foo;

如果您希望看到全局定義導致錯誤嘗試。 int x = 10;int x = 11;作爲一個全局的,你會看到編譯器吐出一個錯誤的效果「redifintion of x」。