c語言中extern
『壹』 c語言中extern的意思是什麼
extern表示是外部函數或外部變數,比如:
1、extern void add(int x,inty);表示該函數主體不在當前模塊中,在另一個模塊中(文件)
2、extern int total;表示該變數在另一個模塊總定義過。
一般都把一些經常用到的枚舉和變數之類的寫在.h頭文件中。這樣要引用時直接include "頭文件名"就可以了調用裡面所有的枚舉和變數了。在大型項目中,引用別的.c文件中的函數則只能用extern,因為.c文件是不能 include的。所以想引用別的.c文件中的函數和全局變數、枚舉等等的就只能用extern。
『貳』 在C語言中,extern的作用是什麼
在定義函數時,如果沒有加關鍵字「static」,或冠以關鍵字「extern」,表示此函數是外部函數:回
[extern] 函數類型答 函數名(函數參數表)
{……}
調用外部函數時,需要對其進行說明:
[extern] 函數類型 函數名(參數類型表)[,函數名2(參數類型表2)……];
[案例]外部函數應用。
(1)文件mainf.c
main()
{ extern void input(…),process(…),output(…);
input(…); process(…); output(…);
}
『叄』 c語言中的extern是什麼,有什麼作用啊
extern關鍵字可以置於變數或者函數前,以標示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。這里起到的是聲明作用范圍的用處。
extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數或變數,那麼要加extern來告訴編譯器用c方式命名函數:
文檔A.cpp調用a.c裡面的變數i和函數callme()
添加了extern 「C」鏈接指示後,上面的代碼就能夠正常運行了。
『肆』 菜鳥:c語言中的extern
C C++都是以單一的源文件為一個獨立的編譯單元的,exten的聲明使得當前的編譯單元可以訪問其他編譯單元定義的變數,但是C C++的語法要求當前的編譯單元必須預先聲明.
名字查找是在命令空間中進行的,這個流程不是局限在某個編譯單元中,而是在當前編譯單元中所有可見的變數,包括include的,extern聲明的.一旦查找到一個以上的名字,就會報錯,就像你上面的一樣.
>> extern int i; //........這里只是聲明,而沒有定義是吧
>> int i; //.........既然上面沒有定義,為什麼這行還報錯為「重復定義」呢
對於編譯器而言,第一行是告訴他在別的編譯單元定義了一個i的整型變數(這個可能定義了,也可能沒有定義,編譯器不做全局檢查,是確定不了的.但是你的意圖就是告訴編譯器你在別的地方定義了這個變數,他還需要全局檢查嗎?),第二行告訴他在本編譯單元也定義了一個同名的變數(這個是肯定定義了的),這是一種錯誤的行為.
名字查找不僅在編譯階段,在link階段也會進行.如果沖突的話,也會報連接錯誤.
『伍』 c語言中的extern
extern 只是申明,起了提示編譯器作用,告訴變數可能在其他文件中定義,當然包括本文件,並非嚴格的非本文件。關鍵要理解「申明」的含義。
『陸』 c語言中extern怎麼用,舉個簡單例子說明下,謝謝。
extern是外部聲明用的,用來聲明外部的函數或者變數定義。
例如,你在1.C中定義了一個函數和變數:
void fun1(void);
int a = 0;
而你要在2.c中調用 fun1(),並且讀取a的值,
那麼需要再2.c的頭部如下外部聲明:
extern void fun1(void);
extern int a = 0;
這樣的話在編譯器在編譯2.c時,不會報錯誤,而在鏈接時找fun1、a,以實現對外部函數、變數的訪問。
『柒』 c語言中extern的意思是什麼
extern是全局變數聲明
只要聲明全局變數就默認 前面加extern(程序員可以不加,但編譯器默認加上)
若本文件 引用別的文件中的全局變數 一定要加上extern 聲明一下
例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中聲明了的一個全局變數
這個extern 是個聲明他可以在任何地方聲明 引用了一個全局變數 (可以試試 在main()函數執行完之後聲明 也不會出錯)
這樣在 工程的總頭文件中就不需要考慮 先#include 哪個文件了
『捌』 C語言中extern的用法
extern可以置於變數或者函數前,以表示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。
另外,extern也可用來進行鏈接指定。
extern 變數
在一個源文件里定義了一個數組:char a[6]; 在另外一個文件里用下列語句進行了聲明:extern char *a; 請問,這樣可以嗎? 答案與分析: 1)、不可以,程序運行時會告訴你非法訪問。原因在於,指向類型T的指針並不等價於類型T的數組。extern char *a聲明的是一個指針變數而不是字元數組,因此與實際的定義不同,從而造成運行時非法訪問。應該將聲明改為extern char a[ ]。 2)、例子分析如下,如果a[] = "abcd",則外部變數a=0x12345678 (數組的起始地址),而*a是重新定義了一個指針變數a的地址可能是0x87654321,直接使用*a是錯誤的. 3)、這提示我們,在使用extern時候要嚴格對應聲明時的格式,在實際編程中,這樣的錯誤屢見不鮮。 4)、extern用在變數聲明中常常有這樣一個作用,你在*.c文件中聲明了一個全局的變數,這個全局的變數如果要被引用,就放在*.h中並用extern來聲明。
函數
extern 函數1 常常見extern放在函數的前面成為函數聲明的一部分,那麼,C語言的關鍵字extern在函數的聲明中起什麼作用? 答案與分析: 如果函數的聲明中帶有關鍵字extern,僅僅是暗示這個函數可能在別的源文件里定義,沒有其它作用。即下述兩個函數聲明沒有明顯的區別: extern int f(); 和int f(); 當然,這樣的用處還是有的,就是在程序中取代include 「*.h」來聲明函數,在一些復雜的項目中,我比較習慣在所有的函數聲明前添加extern修飾。 extern 函數2 當函數提供方單方面修改函數原型時,如果使用方不知情繼續沿用原來的extern申明,這樣編譯時編譯器不會報錯。但是在運行過程中,因為少了或者多了輸入參數,往往會照成系統錯誤,這種情況應該如何解決? 答案與分析: 目前業界針對這種情況的處理沒有一個很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供對外部介面的聲明,然後調用方include該頭文件,從而省去extern這一步。以避免這種錯誤。 寶劍有雙鋒,對extern的應用,不同的場合應該選擇不同的做法。 extern 「C」 在C++環境下使用C函數的時候,常常會出現編譯器無法找到obj模塊中的C函數定義,從而導致鏈接失敗的情況,應該如何解決這種情況呢? 答案與分析: C++語言在編譯的時候為了解決函數的多態問題,會將函數名和參數聯合起來生成一個中間的函數名稱,而C語言則不會,因此會造成鏈接時找不到對應函數的情況,此時C函數就需要用extern 「C」進行鏈接指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈接的中間函數名。 下面是一個標準的寫法: //在.h文件的頭上 #ifdef __cplusplus #if __cplusplus extern "C"{ #endif #endif /* __cplusplus */ … … //.h文件結束的地方 #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */