2011-09-30 72 views
2

看到後this答案 我有這個疑問。 在我的項目, 我已經看到了一些聲明的變量的extern和確定象下面這樣:在定義變量時使用'extern'關鍵字

file1.h

extern int a; 

file1.c中

extern int a=10; 

但在我提到的鏈接中說,在c文件我

int a = 10; 

是否定義過程中添加extern關鍵字太有任何目的/意義:T應當像定義。 或順便問一下?

+1

您引用的問題是一個C問題。你是否想把它標記爲C++? –

回答

4

它不改變意思。 extern只有當你在聲明變量時纔有意義。 定義變量與extern是相同的,因爲所有未標記爲static的全局變量都是鏈接器默認可見的符號。

注意,如果你不想初始化變量,即不具有部分= 10,編譯器將假定extern int a總是聲明而不是定義。在同樣的意義上,具有int a全局總是定義而不只是一個聲明

+0

'int a'(在文件範圍內)是C中的暫定義,C是一個定義,並且總是一個聲明。我想你可能意思是:「......總是一個定義而不是一個聲明」。 –

+1

答案其實不正確。所有名稱空間範圍內未標記爲'static'的非''const'變量對鏈接器都是可見的(具有外部鏈接)。 'const'變量具有內部鏈接(鏈接器不可見),除非在某處標記了'extern'。 –

+0

@JamesKanze:這在C中是否屬實?我認爲這只是C++。 –

3

這取決於。在這種情況下,它沒有區別,但它可以。

這裏有兩個問題:定義與正義宣言以及聯繫。 而C++不能以正交的方式處理它們。在C++中,當且僅當 關鍵字和初始化都不存在時,變量或引用的 聲明纔是定義。 (注意 ,該規則是函數,類型和模板不同)。所以:

extern int a;  // not a definition 
int a;    // definition 
extern int a = 42; // definition 
int a = 42;   // definition 

規則說你必須有一個確切的定義,所以你把 定義在源文件中,並在聲明一個標題。

至於聯動,聲明爲一個變量或一個參考 一個符號具有外部連接如果在命名空間範圍中聲明,並不 聲明static,並且或者(在C++ 11也不constexpr)不const 或已被宣佈爲extern。該const可以給 變量內部鏈接的事實偶爾指extern是 必要的:

int const a = 42;   // internal linkage 
extern int const a = 42; // external linkage 

注意,extern不必在同一聲明:

extern int const a;   // declaration, in header... 
int const a = 42;   // external linkage, because of 
          // previous extern 

仍,我偶爾需要extern;通常是因爲我想 使用本地常量來實例化模板。 (這僅是一個 問題,如果模板參數需要一個指針或引用。您可以 實例化與int參數與int const a = 42;模板,因爲模板被實例化與該值42,而不是 可變a。)

相關問題