有一部分c++程式設計師對於多個原始檔一起編譯鏈結時,變數,函式或者類宣告和實現到底如何定義模糊不清,現在分類澄清一下。
變數 (variable)
在c++中,變數宣告(declaration)只有在使用extern關鍵字時才成立,其他情況下都是定義(definition),而在使用extern的同時給變數賦初始值,則宣告變為定義,extern關鍵字也將被編譯器忽略。c++變數的作用域預設情況下是全域性的,也就是對多個原始檔可見,比如說,如果在a.cpp和b.cpp中都有
int a;
則編譯器鏈結兩個檔案時會報告錯誤,「變數重複定義」。因此,要使變數定義只對該原始檔可見,就要顯式加上static關鍵字。因此,我們可以想到,如果在a.cpp中有
extern int a;
而在b.cpp中有
static int a = 9;
那麼,編譯器鏈結時會給出錯誤資訊,「找不到a的定義」,因為a的定義在b.cpp並只對該檔案可見,a.cpp找不到a的定義因此出錯。
變數的宣告和定義是比較容易混淆的概念,因此記住一點,除非有extern關鍵字,否則都是變數的定義。由此,我們可以歸納出幾點好的程式設計風格:
1. 不要把變數定義放入.h檔案,這樣容易導致重複定義錯誤。
2. 盡量使用static關鍵字把變數定義限制於該原始檔作用域內,除非該變數被設計成全域性的。
例外情況是const變數和typedef型別,在《the c++ programming language》9.2節中說到,const和typedef預設作用域是區域性的,因此不需要static來顯式宣告。因此,在.h檔案中放置const變數定義不會產生問題,編譯器會給每個引用該.h檔案的原始檔產生乙份該const變數的區域性定義,就像該變數是定義於該原始檔中一樣。大家也不用太擔心編譯器這麼做會浪費空間,因為編譯器優化過程一般會把有相同值的const變數進行合併。
對於static關鍵字,要多說幾句的是,static一般有兩種意思,當修飾函式定義裡的變數或者類成員變數時,稱作靜態變數;修飾其他變數時,稱作區域性變數。為防止混淆,一般不要特意給區域性變數加上static關鍵字。除了static關鍵字,namespace也可以使變數定義成為區域性的。
函式 (function)
c++函式的宣告和定義比較容易區分,定義必須有花括號,否則就是宣告。函式的作用域和變數一樣預設是全域性的,因此如果要限制其作用域宇該原始檔,則要加上static關鍵字。由於函式宣告和定義對編譯器來說很容易區分,因此宣告前的extern關鍵字不是必需的。
C 變數和函式的宣告和定義
有一部分c 程式設計師對於多個原始檔一起編譯鏈結時,變數,函式或者類宣告和實現到底如何定義模糊不清,現在分類澄清一下。變數 variable 在c 中,變數宣告 declaration 只有在使用extern關鍵字時才成立,其他情況下都是定義 definition 而在使用extern的同時給變數賦...
c 變數的宣告和定義
1.變數的定義 變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。2.變數的宣告 用於向程式表明變數的型別和名字。程式中變數可以宣告多次,但只能定義一次 3.定義和宣告的區別 一般的情況下我們常常這樣敘述,把分配記憶體空間的宣告稱之為 定義 把不需要分配記...
變數和函式宣告和定義的區別
用慣了ide開發工具,最頭疼的可能就是出現鏈結錯誤 link error 因為鏈結錯誤不像編譯錯誤那樣能夠指定出程式的具體出錯位置 編譯錯誤主要是語法錯誤 編譯主要就是將乙個編譯單元 cpp c 檔案與它相應的標頭檔案 鏈結成乙個.obj檔案,鏈結錯誤主要就是重複定義變數等 宣告和定義的區別 函式或...