1樓:胡說八道小鬼
extern關鍵字可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。這裡起到的是宣告作用範圍的用處。
extern的另外用法是當c和c++混合程式設計時假如c++呼叫的是c源文件定義的函式或變數,那麼要加extern來告訴編譯器用c方式命名函式:
文件a.cpp呼叫a.c裡面的變數i和函式callme()
1、可以通過把原函式名與引數資訊結合,產生一個獨特的內部名字,這種技術叫做名字修飾(name mangling)。名字修飾規則沒有一個標準,所以不同的編譯器的名字修飾規則也不一樣。
下面是一組函式,其中f()函式過載了:
f(void)和f(int)是不同的函式,除了函式名相同以外沒有任何關係。當生成obj目標檔案時,為了區分它們,c++編譯器根據引數資訊進行了名字修飾:
2、c語言中沒有名字修飾(name mangling),因為c語言不支援函式過載。但是如果c++中含有c**,在編譯時c++編譯器對c**的函式也會進行名字修飾,函式名變了以後,將導致在c執行庫中找不到對應函式,發生連結錯誤。
為了防止c++編譯器對c**進行名字修飾,我們將c**用extern “c”進行連結指定,告訴編譯器,在生成中間檔案時,不要對這部分**進行名字修飾,而是生成符合c規則的中間符號名。
新增了extern “c”連結指示後,上面的**就能夠正常執行了。
2樓:
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申明,這樣編譯時編譯器不會報錯。但是在執行過程中,因為少了或者多了輸入引數,往往會照成系統錯誤,這種情況應該如何解決? 答案與分析:
目前業界針對這種情況的處理沒有一個很完美的方案,通常的做法是提供方在自己的***_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 */
3樓:匿名使用者
extern是全域性變數宣告
只要宣告全域性變數就預設 前面加extern(程式設計師可以不加,但編譯器預設加上)
若本檔案 引用別的檔案中的全域性變數 一定要加上extern 宣告一下例如 #include "my_fun.c"
extern int b;//b是在my_fun.c中宣告瞭的一個全域性變數
這個extern 是個宣告他可以在任何地方宣告 引用了一個全域性變數 (可以試試 在main()函式執行完之後宣告 也不會出錯)
這樣在 工程的總標頭檔案中就不需要考慮 先#include 哪個檔案了
4樓:匿名使用者
extern表示是外部函式或外部變數,比如:
1、extern void add(int x,inty);表示該函式主體不在當前模組中,在另一個模組中(檔案)
2、extern int total;表示該變數在另一個模組總定義過。
一般都把一些經常用到的列舉和變數之類的寫在.h標頭檔案中。這樣要引用時直接include "標頭檔案名"就可以了呼叫裡面所有的列舉和變數了。
在大型專案中,引用別的.c檔案中的函式則只能用extern,因為.c檔案是不能 include的。
所以想引用別的.c檔案中的函式和全域性變數、列舉等等的就只能用extern。
5樓:籍尋桃希萊
include是把整個都載入其中,包括檔案裡的所有的函式和變數。而採用extern只需要把需要的變數引用進來。這樣可以保證執行效率,及資源節約!
c語言中,extern 修飾函式是什麼意思?
6樓:匿名使用者
咯咯是這樣的
如果你想定義一個靜態函式
要在函式返回值型別前加static
如果你想定義一個外部函式
要在函式返回值型別前加extern(可省略)也就是說
預設為extern的
7樓:匿名使用者
extern是全域性變數宣告
只要宣告全域性變數就預設 前面加extern(程式設計師可以不加,但編譯器預設加上)
若本檔案 引用別的檔案中的全域性變數 一定要加上extern 宣告一下
例如 #include "my_fun.c"
extern int b;//b是在my_fun.c中宣告瞭的一個全域性變數
這個extern 是個宣告他可以在任何地方宣告 引用了一個全域性變數 (可以試試 在main()函式執行完之後宣告 也不會出錯)
這樣在 工程的總標頭檔案中就不需要考慮 先#include 哪個檔案了
8樓:匿名使用者
extern表明這個函式或者變數在別的檔案中定義的,在檔案a中才能使用這個函式或者變數
不申明extern也能呼叫函式f,我試過了!
那是因為你include了檔案b
9樓:匿名使用者
因為函式是在b裡定義的,a要用b裡的函式,要加extern作外部申明才能用~否則a不識別那個函式~
10樓:天下無敵之蛇
外部說明,可以把該程式中定以的變數用於其他程式中
11樓:匿名使用者
加上以後 外部函式可以呼叫該函式
c語言中「nd」是什麼意思, c c在c語言中是什麼意思
就是對於輸出格式的限制 m.nd 整數,m目標是位數,n表示小數位數。同理有 m.nf 浮點數的情況 希望對你有幫助 d格式 用來輸出十進位制整數。有以下幾種用法 d 按整型資料的實際長度輸出。nd n為指定的輸出欄位的寬度。如果資料的位數小於n,則左端補以空格,若大於n,則按實際位數輸出。ld 輸...
C語言中P23是什麼意思,c語言中12是什麼意思
的優先順序比 bai 高,1 du2 3 1 2 3 1二 位zhi邏輯運算子 符號dao 描述 按位與 按位或 版 按位異或 按位取反 表中權除去最後一個運算子是單目運算子,其他都是雙目運算子。這些運算子只能用於整型表示式。位邏輯運算子通常用於對整型變數進行位的設定 清零 取反 以及對某些選定的位...
c語言中for是什麼意思C語言中for是什麼意思?
在c語言中,for語句使用最為靈活,它的一般形式為 for 表示式1 表示式2 表示式3 語句它的執行過程如下 先求解表示式1。求解表示式2,若其值為真 非0 則執行for語句中指定的內嵌語句,然後執行下面第3 步 若其值為假 0 則結束迴圈,轉到第5 步。求解表示式3。轉回上面第2 步繼續執行。迴...