看到後this答案 我有這個疑問。 在我的項目, 我已經看到了一些聲明的變量的extern和確定象下面這樣:在定義變量時使用'extern'關鍵字
file1.h
extern int a;
file1.c中
extern int a=10;
但在我提到的鏈接中說,在c文件我
int a = 10;
是否定義過程中添加extern
關鍵字太有任何目的/意義:T應當像定義。 或順便問一下?
看到後this答案 我有這個疑問。 在我的項目, 我已經看到了一些聲明的變量的extern和確定象下面這樣:在定義變量時使用'extern'關鍵字
file1.h
extern int a;
file1.c中
extern int a=10;
但在我提到的鏈接中說,在c文件我
int a = 10;
是否定義過程中添加extern
關鍵字太有任何目的/意義:T應當像定義。 或順便問一下?
它不改變意思。 extern
只有當你在聲明變量時纔有意義。 定義變量與extern
是相同的,因爲所有未標記爲static
的全局變量都是鏈接器默認可見的符號。
注意,如果你不想初始化變量,即不具有部分= 10
,編譯器將假定extern int a
總是聲明而不是定義。在同樣的意義上,具有int a
全局總是定義而不只是一個聲明。
'int a'(在文件範圍內)是C中的暫定義,C是一個定義,並且總是一個聲明。我想你可能意思是:「......總是一個定義而不是一個聲明」。 –
答案其實不正確。所有名稱空間範圍內未標記爲'static'的非''const'變量對鏈接器都是可見的(具有外部鏈接)。 'const'變量具有內部鏈接(鏈接器不可見),除非在某處標記了'extern'。 –
@JamesKanze:這在C中是否屬實?我認爲這只是C++。 –
這取決於。在這種情況下,它沒有區別,但它可以。
這裏有兩個問題:定義與正義宣言以及聯繫。 而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
。)
您引用的問題是一個C問題。你是否想把它標記爲C++? –