天天看點

c語言extern關鍵字的作用,C語言中的extern關鍵字的使用

C語言中的extern關鍵字的使用

釋出時間:2018-07-25 10:11,

浏覽次數:492

, 标簽:

extern

引用同一個檔案中的變量

看一段測試代碼:

#define _CRT_SECURE_NO_WARNING 1 #include int func(); int main() {

func(); printf("%d\n", num); return 0; } int num = 4; int func() {

printf("%d\n",num); return num; }

這個時候一編譯會發現編譯器報錯

* 如果按照這個順序,變量

num在main函數的後邊進行聲明和初始化的話,那麼在main函數中是不能直接引用num這個變量的,因為當編譯器編譯到這一句話的時候,找不到num這個變量的聲明,但是在func函數中是可以正常使用,因為func對num的調用是發生在num的聲明和初始化之後。

* 如果我不想改變num的聲明的位置,但是想在main函數中直接使用num這個變量,怎麼辦呢?

* 可以使用extern這個關鍵字。

*

像下面這一段代碼,利用extern關鍵字先聲明一下num變量,告訴編譯器num這個變量是存在的,但是不是在這之前聲明的,你到别的地方找找吧,果然,這樣就可以順利通過編譯啦。但是你要是想欺騙編譯器也是不行的,比如你聲明了extern

int num;但是在後面卻沒有真正的給出num變量的聲明,那麼編譯器去别的地方找了,但是沒找到還是不行的。

修正後的代碼

#define _CRT_SECURE_NO_WARNING 1 #include int func(); int main() {

extern int num; func(); printf("%d\n", num); return 0; } int num = 4; int

func() { printf("%d\n",num); return num; }

引用另一個檔案中的變量

如果extern這個關鍵字就這點功能,那麼這個關鍵字就顯得多餘了,因為上邊的程式可以通過将num變量在main函數的上邊聲明,使得在main函數中也可以使用。

extern這個關鍵字的真正的作用是引用不在同一個檔案中的變量或者函數。

main.c

#include int main() { extern int num; printf("%d",num); return 0; }

fun.c

#include int num = 5; void func() { printf("fun in a.c"); }

* 這裡b.c中定義了一個變量num,如果main.c中想要引用這個變量,那麼可以使用extern這個關鍵字,

* 注意這裡能成功引用的原因是,num這個關鍵字在b.c中是一個全局變量

,也就是說隻有當一個變量是一個全局變量時,extern變量才會起作用,向下面這樣是不行的。

main.c

#include int main() { extern int num; printf("%d",num); return 0; }

fun.c

#include void func() { int num = 5; printf("fun in a.c"); }

* extern關鍵字隻需要指明類型和變量名就行了,不能再重新指派,

* 初始化需要在原檔案所在處進行,如果不進行初始化的話,全局變量會被編譯器自動初始化為0。像這種寫法是不行的。 extern int num=4;

* 但是在聲明之後就可以使用變量名進行修改了,像這樣 #include int main() { extern int num;

num=1; printf("%d",num); return 0; }

* 當然了,如果不想修改還可以使用const修飾

*

使用include将另一個檔案全部包含進去可以引用另一個檔案中的變量,但是這樣做的結果就是,被包含的檔案中的所有的變量和方法都可以被這個檔案使用,這樣就變得不安全,

* 如果隻是希望一個檔案使用另一個檔案中的某個變量還是使用extern關鍵字更好。

引用另一個檔案中的函數

extern除了引用另一個檔案中的變量外,還可以引用另一個檔案中的函數,引用方法和引用變量相似。

main.c

#include int main() { extern void func(); func(); return 0; }

fun.c

#include const int num=5; void func() { printf("fun in a.c"); }