C語言中extern用法詳解

2021-07-22 03:24:52 字數 1902 閱讀 8786

本文基於vc6.0 編譯器

首先文件結構如下:

myextern.h和myextern.c中定義extern函式

main.c中定義main方法,呼叫extern函式

1.第乙個嘗試:

myextern.h: void print();

myextern.c: void print()

main.c: extern void print(); 並且main();成功,警告錯誤均無

說明extern的作用是,宣告本模組中的print()是來自其他模組(myextern.c)的

2.第二個嘗試:

myextern.h: extern void print();

myextern.c: print()

main.c: extern void print();並且main()也沒問題,警告錯誤均無

3.第三個嘗試:

myextern.h: extern void print();

myextern.c: print()

main.c: void print();並且main()也沒問題,警告錯誤均無

4.第四個嘗試:

myextern.h: void print();

myextern.c: print()

main.c: void print();並且main(), 也沒問題,警告錯誤均無

5.第五個嘗試:

myextern.h: void print();

myextern.c: print()

main.c: 不宣告print(),直接main(),編譯時無錯誤問題,但是有警告:'print' undefined; assuming extern returning int。但是鏈結時正確,無錯誤也無警告,另外可以看出,編譯器是預設assume它是extern的,這也是接下來6,7兩個嘗試證明的東西:

6.第六個嘗試:

myextern.h: extern void print();

myextern.c: print()

main.c: extern print();並且再次實現print()然後main(),編譯時錯誤:print()重定義了

7.第七個嘗試:

myextern.h: void print();

myextern.c: print()

main.c: print();並且再次實現print()然後main(),編譯時錯誤:print()重定義了 

由上述嘗試,可以得出結論:無論你有沒有宣告extern, 當你沒有使用static的時候,編譯器預設所有模組宣告的函式都是extern的,在整個工程命名空間裡面,函式是不能重定義的,但是可以重複宣告,即:在同一命名空間裡,只能有乙個函式的實現,比如:你可以:a.h: extern void f();  b.h: extern void f();  c.h: extern void f();  d.h:void f(); 但是,在a.c, b.c, c.c, d.c 中,你只能有乙個函式實現,不然,不管過不過的到編譯這關,鏈結的時候肯定會報錯,因為你redefinition了~~。

另外注意,不要企圖用static void f();宣告來區分命名空間,static不能分割可見域,static的作用在於它可以分割作用域,即,其他模組不能使用到static void f();但是,其他模組對於static void f()是可見的,在它們內部,可以宣告void f(),但是不能重新對f()進行實現。

發現vc的乙個bug:

a.c:

void print()

main.c:

void print()

void main()

結果是:函式執行的結果很隨機:有時候是myextern printf, 有時候是this main's print, 有時候鏈結出錯。 很奇怪,不知道是vc的bug,還是有理解問題

C語言中extern的用法

在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。這裡需要注意的是,被引用的變數v的鏈...

C語言中extern的用法

第一篇 一,static和extern 大工程下我們會碰到很多原始檔。檔案a.c static int i 只在a檔案中用 int j 在工程裡用 static void init 只在a檔案中用 void callme 在工程中用 上面的全域性i變數和init 函式只能用在a.c檔案中,全域性變數...

c語言中的extern用法

test.c include int number 1 int getnum int num int getnum2 int num main.c include extern int getnum int num extern int getnum2 int num extern int numb...