C 快速入門 exern關鍵字的用法

2021-06-21 13:08:49 字數 3078 閱讀 2154

extern是c/c++語言中表明函式和全域性變數作用範圍(可見性)的關鍵字.它告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。

1。對於extern變數來說,僅僅是乙個變數的宣告,其並不是在定義分配記憶體空間。如果該變數定義多次,會有連線錯誤

2。通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字 extern宣告。也就是說c檔案裡面定義,如果該函式或者變數與開放給外面,則在h檔案中用extern加以宣告。所以外部檔案只用include該h 檔案就可以了。而且編譯階段,外面是找不到該函式的,但是不報錯。link階段會從定義模組生成的目標**中找到此函式。

3。與extern對應的關鍵字是static,被它修飾的全域性變數和函式只能在本模組中使用。

常常見extern放在函式的前面成為函式宣告的一部分,那麼,c語言的關鍵字extern在函式的宣告中起什麼作用?

答案與分析:

如果函式的宣告中帶有關鍵字extern,僅僅是暗示這個函式可能在別的原始檔裡定義,沒有其它作用。即下述兩個函式宣告沒有明顯的區別:

extern int f(); 和int f();

當然,這樣的用處還是有的,就是在程式中取代include 「*.h」來宣告函式,在一些複雜的專案中,我比較習慣在所有的函式宣告前新增extern修飾。

4 問題:extern 函式2

當函式提供方單方面修改函式原型時,如果使用方不知情繼續沿用原來的extern申明,這樣編譯時編譯器不會報錯。但是在執行過程中,因為少了或者多了輸入引數,往往會照成系統錯誤,這種情況應該如何解決?

答案與分析:

目前業界針對這種情況的處理沒有乙個很完美的方案,通常的做法是提供方在自己的***_pub.h中提供對外部介面的宣告,然後呼叫方include該標頭檔案,從而省去extern這一步。以避免這種錯誤。

在乙個標頭檔案中宣告的函式

#ifndef __head_h__

#define __head_h__

extern void fun();

#endif

的作用是想讓其他有 #include "head.h"的檔案都有 extern void fun();這句話。這樣的話,在連線的時候就會自動去找到fun函式的實現.因為對於函式來說:

void fun();

這樣也算是宣告。所以我認為 這裡寫不寫extern都可以。但是如果是變數就不同了。

#ifndef __head_h__

#define __head_h__

extern int i;

#endif

#include "head.h"

int i=3;

#include "head.h"

#include

using namespace std;

//如果head.h裡面沒有寫 extern int i;

//在這裡新增也一樣

//extern int i;

int main()

coutextern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。

另外,extern也可用來進行鏈結指定。

2 問題:extern 變數

在乙個原始檔裡定義了乙個陣列:

char a[6];

在另外乙個檔案裡用下列語句進行了宣告:

extern char *a;

請問,這樣可以嗎?

答案與分析:

1)、不可以,程式執行時會告訴你非法訪問。原因在於,指向型別t的指標並不等價於型別t的陣列。extern char *a宣告的是乙個指標變數而不是字元陣列,因此與實際的定義不同,從而造成執行時非法訪問。應該將宣告改為extern char a[ ]。

2)、例子分析如下,如果a = "abcd",則外部變數a=0x61626364 (abcd的ascii碼值),*a顯然沒有意義,如下圖:

顯然a指向的空間(0x61626364)沒有意義,易出現非法記憶體訪問。

3)、這提示我們,在使用extern時候要嚴格對應宣告時的格式,在實際程式設計中,這樣的錯誤屢見不鮮。

4)、extern用在變數宣告中常常有這樣乙個作用,你在*.c檔案中宣告了乙個全域性的變數,這個全域性的變數如果要被引用,就放在*.h中並用extern來宣告。

3 問題:extern 函式1

常常見extern放在函式的前面成為函式宣告的一部分,那麼,c語言的關鍵字extern在函式的宣告中起什麼作用?

答案與分析:

如果函式的宣告中帶有關鍵字extern,僅僅是暗示這個函式可能在別的原始檔裡定義,沒有其它作用。即下述兩個函式宣告沒有明顯的區別:

extern int f(); 和int f();

當然,這樣的用處還是有的,就是在程式中取代include 「*.h」來宣告函式,在一些複雜的專案中,我比較習慣在所有的函式宣告前新增extern修飾。

4 問題:extern 函式2

當函式提供方單方面修改函式原型時,如果使用方不知情繼續沿用原來的extern申明,這樣編譯時編譯器不會報錯。但是在執行過程中,因為少了或者多了輸入引數,往往會照成系統錯誤,這種情況應該如何解決?

答案與分析:

目前業界針對這種情況的處理沒有乙個很完美的方案,通常的做法是提供方在自己的***_pub.h中提供對外部介面的宣告,然後呼叫方include該標頭檔案,從而省去extern這一步。以避免這種錯誤。

寶劍有雙鋒,對extern的應用,不同的場合應該選擇不同的做法。

5 問題:extern 「c」

在c++環境下使用c函式的時候,常常會出現編譯器無法找到obj模組中的c函式定義,從而導致鏈結失敗的情況,應該如何解決這種情況呢?

答案與分析:

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

下面是乙個標準的寫法:

//在.h檔案的頭上

#ifdef __cplusplus

#if __cplusplus

extern "c"

#endif

#endif /* __cplusplus */

C 關鍵字(入門)

c 98 63個關鍵字 在此選擇平時比較常用的關鍵字解釋 標準輸入cin,通過鍵盤輸入程序式中 標準輸出cout,將程式執行結果通過顯示器輸出 標準錯誤cerr,將程式執行中的錯誤通過顯示器輸出 int a 10 cin a cout 如果專案工程足夠大,對於變數的命名以及對於函式的命名重複型就會提...

C 的關鍵字

c 的關鍵字 auto 宣告自動變數,一般不使用 bool 宣告乙個布林型變數 break 跳出當前迴圈 asm 插入乙個彙編指令 case 開關語句分支 catch 處理throw產生的異常 char 宣告乙個字元弄變數 class const 宣告乙個常量 const case 從乙個const...

C語言static關鍵字怎麼用

static關鍵字可以修飾 1.修飾區域性變數 靜態區域性變數 2.修飾全域性變數 靜態全域性變數 3.修飾函式 靜態函式1.修飾區域性變數 static修飾區域性變數改變了變數的生命週期,讓靜態區域性變數出了作用域依然存在,到程式結束,生命週期才結束。2.修飾全域性變數 乙個全域性變數被stati...