extern表明變量或者函數是定義在其他其他文件中的
例如:extern int a;
顯式的說明了a的存儲空間是在程序的其他地方分配的,在文件中其他位置或者其他文件中尋找a這個變量。
用法
- 一個c文件需要調用另一個c文件裏的變量或者函數,而不能從.h文件中調用變量。詳見下文1
- extern int a = 5與int a = 5意義是一樣的,都是定義。而extern int a;是聲明。但會產生一條警告。詳見下文2
- 對於函數而言,和引用變量是一樣的,如果需要調用其他.c文件中的函數,在文件中的函數聲明前加extern即可,不加extern而直接聲明函數也可以,因爲聲明全局函數默認前面帶有extern。詳見下文3
- 如果不想讓其他.c文件引用本文件中的變量,加上static即可。詳見下文4
建議最優用法
例如a.c文件中定義int a = 5和一個函數,在a.h裏寫extern int a;,如果要在其他文件裏調用a這個變量和函數,直接#include<a.h>即可。如下圖
1.一個c文件需要調用另一個c文件裏的變量或者函數,而不能從.h文件中調用變量
只能引用另外一個.c文件裏的變量或者函數,不能引用.h文件裏的變量,當然,也非常不建議在.h文件裏定義變量。因爲在.h文件裏定義變量,如果這個.h文件被多個.c文件包含則會報重複定義的錯誤,文章末尾詳講。
例1:在a.h文件中定義一個變量,在b.c文件中引用,會報錯,未定義這個變量
例2:在a.c文件中定義一個變量,在b.c文件中引用,成功調用
2.extern int a = 5與int a = 5意義是一樣的,都是定義。而extern int a;是聲明。但會產生一條警告
例1:在a.h文件中使用extern int a = 5定義一個變量,在b.c文件中引用,會報warning,但程序可以運行
3.引用函數
引用變量是一樣的,如果需要調用其他.c文件中的函數,在文件中的函數聲明前加extern即可,不加extern而直接聲明函數也可以,因爲聲明全局函數默認前面帶有extern。見下面例子
例1:a.c中定義一個fun函數,b.c中要引用這個函數,b.c中的聲明extern int fun(); 與int fun();沒有任何區別,如下兩個圖
4.如果不想讓其他.c文件引用本文件中的變量,加上static即可
static 表示靜態的變量,限制此變量作用域在一個源文件內,其他文件不能用extern來引用此變量,不僅適用於變量,函數也可以。如下圖例子,b.c文件就不能引用a.c文件裏的靜態變量ckx。
5.extern和include的區別
include相當於把include .h文件直接帶入到本源文件裏,比如在b.c文件裏include "a.h",就相當於把a.h文件裏所有定義的變量和函數全部拷貝了一份放入了b.c裏,一個項目裏,一個.h文件可能會被多個.c源文件包含,這樣編譯的時候就會報重複定義的錯誤。而且儘量不要在.h裏定義變量,這是一個不好的習慣。
例子:在a.h裏定義一個變量,a.c和b.c都包含這個.h文件,編譯的時候就會報錯。