2012-04-10 61 views

回答

6

extern允許在不定義它(將其帶入存在)聲明變量(通知其存在的編譯器)。一般規則是,您可以根據需要多次聲明事物,但只能定義一次。

這是有用的,如果,例如,它將被別處定義。

考慮:

file1.c:     file2.c: 
    extern int xyzzy;   int xyzzy; 
    void fn (void) { 
     xyzzy = 42; 
    } 

當你把這兩種功能聯繫在一起,會有一個xyzzy,在file2.c定義的,而這就是一個fn會改變。

現在出現這種情況,即使沒有extern。什麼extern確實是聲明xyzzy存在file1.c,這樣你就不會得到任何I don't know what the blazes "xyzzy" is錯誤。

你的具體情況(如果這些是你唯一兩個文件了),你不需要它。只有當您有另一個文件#include d file1.h並試圖訪問i時才需要。

+0

+1我喜歡你的「聲明」和「定義」的定義, – JeremyP 2012-04-10 10:51:09

1

extern告訴編譯器它聲明瞭一個變量。

在您的file1.h示例中,想象如果您未指定extern關鍵字會發生什麼情況。它看起來像int i有兩個定義。另外,頭文件可以包含在許多.c文件中。如果你編譯這些.c文件並鏈接它們,鏈接器將會看到同一個變量的多個定義。

foo.h中

extern int i; 
void bar(); 

一個:

3

當你有三個文件是非常有用。C:

#include "foo.h" 
int i = 6; 
int main(){ 
    bar(); 
} 

b.c:

#include "foo.h" 
void bar(){ 
     printf("%d\n", i); 
} 

正如你所看到的,ia.cb.c之間共享,每個文件不重新定義,如無extern關鍵字會發生。

2

在C中的「外部的」聲明是指示存在的存在,並且,一個全局變量的類型。

在C大多每個.c文件的行爲類似於一個單獨的模塊。因此具有「extern」的變量是在當前模塊的外部定義的。

它始終是一個更好的做法是定義全局在一個地方,然後在所有其他地方宣佈它的extern引用。引用任何共享庫提供的全局變量時,爲了確保代碼引用變量的正確和常見的實例,這一點很重要。

3

Wikipedia來自:

當一個變量定義,編譯器對於 變量分配內存和可能還初始化它的內容爲某個值。 當聲明變量時,編譯器要求在別處定義變量 。聲明通知一個 變量由名稱和類型存在的編譯器,但因爲它是在其他地方分配的編譯器不需要 爲它分配內存。

的extern一種方法可以顯式地聲明變量,或強制 聲明沒有定義

如果變量在文件1中所定義,以便利用相同的 變量在另一個文件中,它必須被宣佈。不管 號文件中,這個變量只被定義一次,但是,它必須 聲明在任何文件中包含的定義一個之外。

如果程序是在幾個源文件,和一個變量被定義file1中 和file2中和file3的使用,則外部聲明是 需要file2中和file3的連接變量的發生。

1

extern關鍵字可以讓你說的編譯器...「現在使用這個變量..我會定義,後來初始化」 ..即「現在編譯它。後來我將鏈接到它的定義」。

您可以將的extern變量時,你在其他一些文件中定義它,你想在目前情況下使用它..

1

標題中的聲明,您可以從多個源文件訪問變量,而仍然只在一個地方定義它。