標頭檔案中的(全域性)變數只能放宣告,不能定義
標頭檔案中的變數只能宣告,不能定義,否則其他多個.c檔案包含該標頭檔案,出現重複定義,導致鏈結出錯。
#ifndef #define #endif防止的是「重複編譯」,而不是「重複定義」
重複編譯可能造成重複定義,但重複定義的**不只有重複編譯
從**變成可執行的程式,需要兩個步驟
編譯和鏈結
編譯開始時,將所有#include標頭檔案的地方替換成該標頭檔案的**
在編譯階段,編譯所有原始檔成為模組,各模組中的每個變數與函式都得到了屬於自己的空間
在鏈結階段,各個模組被組合到一起
#ifndef能夠防止在編譯階段,一段**被重複編譯,並且由此可以避免乙個變數被重複定義
解決方法:不僅用#ifndef組合防止重複編譯,而且將變數在原始檔中定義,只在標頭檔案裡放extern宣告
這樣各模組在編譯的時候,就知道「有這麼個變數,但它的空間不在我這裡」,鏈結的時候,這個變數雖然出現在所有包含這個標頭檔案的模組裡,但只有乙個模組是它的真身所在。
C 宣告和定義
c 宣告和定義 宣告和定義最主要的區別是 宣告不申請記憶體空間而定義申請記憶體空間。定義申請記憶體空間這點需要.好像很多人這樣理解 我怎麼以為這有點問題 這裡有個簡單的錯誤,尤其是對我以c 的情景來理解c 標頭檔案中的 int a 全域性變數這樣寫 在c 中是定義。這裡有個情況是 如果 int a ...
c 的宣告和定義
c 中,除了inline函式和符號常量之外,普通的物件和函式只能被定義一次,所以.h的標頭檔案就用來儲存物件和函式的宣告,而將定義儲存在乙個.cpp中,其它要使用該物件或函式的.cpp檔案就可以包含該.h標頭檔案。同時使用extern字首表示 該物件已經在別處被定義,這裡只是給編譯器乙個提示。同時,...
宣告和定義
宣告 向計算機介紹名字,它說,這個名字是什麼意思 而 定義 為這個名字分配 儲存空間。無論涉及到變數時還是函式時含義都一樣。無論在哪種情況下,編譯器都在 定義 處分配儲存空間。對於變數,編譯器確定這個變數佔多少儲存單元,並在記憶體中產生存放它們 的空間。對於函式,編譯器產生 並為之分配儲存空間。函式...