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語言中12ld是什麼意思,C語言中c是什麼意思
12表示的是輸出時佔12個位 置的長度,也就是如果數字是 12.345 它只有五個位,但是卻佔了12位的長版度,其它位在輸出權上用空格來填充 比如說執行下面的程式 include stdio.h void main 執行結果為 2press any key to continue而把12去掉又不同 ...
c語言中a a 6是什麼意思,c語言中,a b是什麼意思?
回答的好請採納哦!這是c語言中的 右移運算子 一般情況下,他是專按位操作。特點 屬1.雙目運算子,就像 一樣,格式為 數1 數2 2.數1是被運算元,如被減數 被除數等 數2是右移位數。3.優先順序低,結合性 從左向右運算 如 8 1 表示將被移數向右移動1位 如何操作?1.化十進位制數為 注意了 ...
c語言中,cpp是啥意思,c語言中cpp是啥意思嗎
c語言和cpp是兩個不同的概念。c語言一 般指標準的c程式語言,ansi c。而cpp是c語言基礎上的擴充套件,即回所說的答c 語言。其在c的基礎上,增加了類的概念,並引入了引用,過載,多型的理念,使面向過程的c語言進步到物件導向的c 語言。同時c 語言完美相容了c語言。cpp的 為,c 的英文寫法...