c-變數的宣告與定義以及關鍵字extern的用法
2009-02-09 20:38
from:
在很多編碼規則都有這樣一條,變數與函式的宣告放在標頭檔案中,它們相應的定義放在原始檔中。
可是很多人尤其是初學者對宣告和定義分辨不清,覺得宣告即是定義,定義即是宣告。造成這種混淆
並不奇怪,因為變數在大多數情況下,宣告的同時就定義了。
e.g.
int var; //宣告的同時也對其定義了
int main(int argc, char **argv)
而如下是純粹的宣告,沒有包含定義
e.g.
extern int val; //僅僅宣告這是個外部變數,extern的具體作用在後面講。
extern int val1 = 1; // 宣告並定義外部變數
int main(int argc, char **argv)
而函式的宣告與定義也是類似的。而且要更容易區分。
e.g.
void func() //即是宣告也是定義
int main(int argc, char **argv)
僅僅對函式宣告的話,就不需要寫函式體,只要宣告函式型別以及函式形參的資訊就可以了。
e.g.
void func(char); //僅僅是宣告
int main(int argc, char **argv)
void func(char *str) //函式定義,如果此檔案中沒有這部分定義的話,main中可以編譯,但不能鏈結
之所以函式的定義與宣告比較好區分是因為函式必須得有函式體編譯器才能給它分配空間,而變數僅僅需要要個名字和它的型別編譯器就
可以分配空間給它。
所以可以這樣說,宣告只是告訴編譯器宣告的變數和函式是存在的,但並沒有真正分配空間給它,所以當後面的**
用到前面宣告的變數或函式時,編譯器在編譯的時候不會報錯,但是在鏈結的時候會報錯,因為鏈結的時候編譯器會去
尋找這些變數和函式的記憶體位址,因為只宣告了但沒定義,鏈結器當然找不到它們了,所以就報錯了。而對它們進行定義
了的話編譯器就會給它們分配空間,它們就有自己的位址了,這時就能鏈結了。
所以定義是要分配空間的,所以定義只能有一次。而宣告不分配空間,你可以宣告多次。
extern關鍵字
我今天寫這邊短文就是因為有人問我extern的用法,他們知道怎麼樣extern,但是對extern原理不清楚,知其然不知其所以然。
上面main2.c中的extern int val; 它的作用就是告訴編譯器這個變數是在其他檔案中定義的(是外援),要是在本檔案中
看到它的名字千萬別奇怪。編譯器是相信自己人的,所以在編譯的時候要是看到val變數時會認為它是存在,不會報錯。只有在
鏈結的時候鏈結器才會去其它obj檔案中尋找val變數的定義(位址),找到則順利鏈結,否則報錯。因為編譯器只需要知道extern所
宣告變數的名字就可以了,所以extern int val 可以寫成 extern val(即省略變數型別)。
e.g.
extern int val; //宣告val是個外部變數,也可以寫成extern val;
int main(int argc, char **argv)
int val;
把這兩個檔案一起編譯鏈結是沒有問題的。
並不是所有的變數都能用extern宣告,只有全域性變數並且沒有被static 宣告的變數才能宣告為extern.
所以如果你不想自己原始檔中全域性的變數被其他檔案引用,你就可以給變數加上static宣告
e.g.
extern val; //鏈結的時候會報錯,因為val被宣告為static.
int main(int argc, char **argv)
static int val;
這也是static全域性變數和非static全域性變數的唯一的乙個區別。
C C 變數宣告 extern關鍵字
extern關鍵字表示變數在檔案以外定義的,或是在檔案後面部分才定義的。在變數定義之前加上extern關鍵字表示宣告乙個變數但不定義它,例如 extern int a extern關鍵字也可以用於函式宣告。例如 extern int fun1 int length,int width 因為沒有函式體...
關鍵字定義以及使用
關鍵字驅動 直接呼叫已有的關鍵字 組織成自動化用例,一條用例就是乙個關鍵字,乙個用例集裡邊最多不會超過30個 引入關鍵字 library 關鍵字,在settings中引用進來,才能在test cases中使用。系統關鍵字 第三方庫。將用例步驟封裝成關鍵字,在測試用例中直接呼叫關鍵字即可。使用者關鍵字...
C const關鍵字定義變數
1.使用const關鍵字定義的變數,不能對其變數的值進行修改,所以必須在初始化的時候進行賦值操作。2.同乙個專案中不同的cpp檔案中定義的const全域性變數不共享,即互相不能訪問,即使是在不同的cpp中有同名的const全域性變數,也是自己使用自己的不相互干擾,也不會報錯變數同名。3.如果希望在多...