c語言中extern關鍵字詳解
內容清單:
1. 用extern宣告外部變數
(1)在乙個檔案內宣告的外部變數
(2)在多個檔案中宣告外部變數
(3)在多個檔案中宣告外部結構體變數
2. 用extern宣告外部函式
3. 總結
1. 用extern宣告外部變數
定義:外部變數是指在函式或者檔案外部定義的全域性變數。外部變數定義必須在所有的函式之外,且只能定義一次。
(1) 在乙個檔案內宣告的外部變數
例子:#include
int max(int x,int y); //函式提前宣告
int main(int argc,char *argv[ ] )
int x = 10; //定義外部變數
int y = 20;
int max(int x, int y)
其中,用extern宣告外部變數時,型別名可以省略。例如,「extern int x;」,可以改寫成「extern x;」。
小結:這種用方法簡單,實用性不大。
(2) 在多個檔案中宣告外部變數
作用域:如果整個工程由多個檔案組成,在乙個檔案中想引用另外乙個檔案中已經定義的外部變數時,則只需在引用變數的檔案中用extern關鍵字加以宣告即可。可見,其作用域從乙個檔案擴充套件到多個檔案了。
例子:檔案a.c的內容:
#include
int base=2; //變數定義
int exe(int x); //外部函式提前宣告
int main(int argc, char *agrv)
檔案b.c的內容:
#include
extern base; //外部變數宣告
int exe(int x)
; //全域性變數
a_class next_post=; //全域性變數
int main(int argc,char *argv)
檔案b.h的內容:
#ifndef __b_h
#define __b_h
#if 1
typedef structa_class;
#endif
extern a_class local_post; //外部結構體變數宣告
extern a_class fun(int x,int y,int z); //介面函式宣告
#endif
檔案b.c的內容:
#include
#include "b.h"
a_class fun(a_class first,a_class next)
檔案c.h的內容:
#ifndef __c_h
#define __c_h
extern int print(char *,a_class post);
#endif
檔案c.c的內容:
#include
#include "b.h"
int print(char *str,a_class post)
利用gcc工具編譯gcc a.c b.c c.c–o demo,再執行./demo,結果為
first point : (1,2,3)
second point : (10,9,8)
the vector is (9,8,5)
小結:在a.c檔案中定義全域性變數a_class local_post結構體,並且呼叫b.c中的介面函式a_class fun(int x,int y,int z)和c.c中int print(char *str,a_class post),在b.h中宣告外部結構體變數local_post,同時,需要對其型別a_class進行實現,在b.h檔案中,如果遮蔽掉a_class的實現,而在b.h以外的檔案中實現,此時編譯時就會出錯,由於c.c檔案中用到a_class定義的型別,所以需要在該檔案中包含b.h。
這裡需要說明的是,如果呼叫外部結構體等多層結構體變數時,需要對這種變數進行實現,使用時,加上模組的標頭檔案即可,否則會報錯。
實際工程中,模組化程式檔案,一般提供乙個.c和乙個.h檔案,其中.h檔案被.c檔案呼叫,.h檔案中實現。
2. 用extern宣告外部函式
a. 定義函式時,在函式返回值型別前面加上extern關鍵字,表示此函式時外部函式,可供其他檔案呼叫,如extern int func (int x,int y),c語言規定,此時extern可以省略,**為外部函式。
b. 呼叫此函式時,需要用extern對函式作出宣告。
例子:檔案a.c的內容:
#include
#include "b.h"
int main()
檔案b.h的內容:
#ifndef __f_h
#define __f_h
extern int add(int x,int y);
extern int sub(int x,int y);
extern int mult(int x,int y);
extern int div(int x,int y);
#endif
檔案b.c的內容:
#include
int add(int x,int y)
int sub(int x,int y)
int mult(int x,int y)
int div(int x,int y)
printf("mult() fail!the second para can not be zero!\n ");
return(-1);
}利用gcc工具編譯gcc a.c b.c –o demo,再執行./demo,結果為
x = 10,y = 5
x + y = 15
x - y = 5
x * y = 50
x / y = 2。
小結:由上面簡單的例子可以看出,在b.h檔案中宣告好b.c的函式,使用時,只需要在a.c中包含#include 「b.h」標頭檔案即可,這樣就可以使用b.c的介面函式了,在實際工程中,通常也是採用這種方式,.c檔案中實現函式,.h檔案中宣告函式藉口,需要呼叫.c檔案的函式介面時,只需包含.h標頭檔案即可。
3. 總結
在實際工程中,有兩種情況比較多。一是利用extern只宣告外部函式,不需要傳遞需要外部宣告的變數,乙個模組化介面檔案對應乙個宣告介面的標頭檔案,需要呼叫介面函式時,只需要包含其標頭檔案。二是利用用extern宣告外部函式,同時宣告需要傳遞的外部變數,做法和第一種情況一樣,宣告都放在標頭檔案中,但是,模組檔案也需要包含該標頭檔案。另外,如果結構體等比較複雜的變數,則需要包含其定義的標頭檔案。另外,定義的外部變數屬於全域性變數,其儲存方式為靜態儲存,生存週期為整個程式的生存週期。
C語言中的extern
在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。這裡需要注意的是,被引用的變數v的鏈...
C語言中的extern
extern可以置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。在乙個原始檔裡定義了乙個陣列 char a 6 在另外乙個檔案裡用下列語句進行了宣告 extern char a 請問,這樣可以嗎?答...
C語言中extern的用法
在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。這裡需要注意的是,被引用的變數v的鏈...