C 的宣告和定義及extern用法

2021-05-28 11:27:42 字數 997 閱讀 1970

變數的定義:用於為變數分配儲存空間,還可以為變數指定初始值,程式中變數只能被定義一次。

變數的宣告:用於向程式表明變數的型別和名稱,可以通過使用extern關鍵字宣告變數名而不定義它,這樣就不會為變數分配儲存空間,宣告可以多次執行。

變數的定義也是宣告,同時還分配了儲存空間。

如果宣告有初始化式,那麼它可被當作定義,如:

extern double pi = 3.1416;

注意:只有當extern宣告位於函式外部時,才可以含有初始化式。

extern可以置於變數或者函式前,以宣告該變數或者函式,相當於告訴編譯器,變數或者函式的定義可能在別的檔案中。extern也可用來進行鏈結指定。

請看下面乙個例子:

在乙個原始檔裡定義了乙個陣列:char a[6];

在另外乙個檔案裡用下列語句進行了宣告:extern char *a;

這樣的做法是不可以的,原因在於,指向型別type的指標並不等價於型別type的陣列。extern char *a宣告的是乙個指標變數而不是字元陣列,因此與實際的定義不同,從而造成執行時非法訪問,應該將宣告改為extern char a[ ]。如果a = "abcd",則外部變數a=0x61626364 (abcd的ascii碼值),*a顯然沒有意義,顯然a指向的空間(0x61626364)沒有意義,易出現非法記憶體訪問,所以在使用extern時候要嚴格對應宣告時的格式。

c++語言在編譯的時候為了解決函式的多型問題,會將函式名和引數聯合起來生成乙個中間的函式名稱,而c語言則不會,因此會造成鏈結時找不到對應函式的情況,此時c++原始檔中c函式就需要用extern 「c」進行鏈結指定,這告訴編譯器,要按照c的編譯和鏈結規則來編譯和鏈結,即保持我的名稱,不要給我生成用於鏈結的中間函式名。

下面是乙個標準的寫法:

//在.h檔案的頭上

#ifdef __cplusplus

#if __cplusplus

extern "c"

#endif

#endif /* __cplusplus */ 

extern 宣告函式和定義函式

extern 關鍵字放在函式宣告之前 test.h extern int test 如果這樣函式的宣告中帶有關鍵字extern,僅僅是暗示這個函式可能在別的原始檔裡定義。這樣一來,就是在程式中取代include h 來宣告函式,在一些複雜的專案中,比較習慣在所有的函式宣告前新增extern修飾,以防...

C語言 extern宣告的總結

c語言 extern宣告的總結1 基本解釋 extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。2 問題 extern 變數 在乙個原始檔裡定義了乙個陣列 char a 6 在另外乙個檔...

c 的宣告和定義

c 中,除了inline函式和符號常量之外,普通的物件和函式只能被定義一次,所以.h的標頭檔案就用來儲存物件和函式的宣告,而將定義儲存在乙個.cpp中,其它要使用該物件或函式的.cpp檔案就可以包含該.h標頭檔案。同時使用extern字首表示 該物件已經在別處被定義,這裡只是給編譯器乙個提示。同時,...