extern可置於變數或者函數前,以表示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找其定義。 另外,extern也可用來進行鏈接指定。用法分析: 在一個變數前加extern 比如:extern unsigned int Test;編譯器編譯的時候,會把Test當成是外 ...
extern可置於變數或者函數前,以表示變數或者函數的定義在別的文件中,提示編譯器遇到此變數和函數時在其他模塊中尋找
其定義。
另外,extern也可用來進行鏈接指定。
用法分析:
在一個變數前加extern 比如:extern unsigned int Test;
編譯器編譯的時候,會把Test當成是外部的!會在其他地方尋找Test這個變數的定義,如果只加extern那麼編譯器就會報錯!
比如這樣:
1>main.obj : error LNK2001: 無法解析的外部符號 "int Test" (?Test@@3HA)
1>E:\wtl\test\test\Debug\test.exe : fatal error LNK1120: 1個無法解析的外部命令
因為extern關鍵字只是說明我們從外部引用了一個變數,該變數的值叫Test,提醒編譯器要到其他文件中查找該變數!
要想不報錯,在其他文件加int Test 定義一個名字叫Test的變數吧。這樣就能編譯通過。
那麼假設我有個main.c,source1.c,source2.c那麼我想要在main裡面定義一個變數,在source1.c跟source2.c都能使用該如何做?
很簡單,先在main.c中定義一個值:int data;
那麼在兩個點c文件中都加上:extern int data,
這個變數能被這三個.c文件共用了,相當於一個全局變數。
示例代碼:
//Main.c #include #include "source1.h" #include "source2.h" int data; using namespace std; void main() { data = 4; adddata2(); cout<<data<<endl; adddata1(); cout<<data<<endl; cout<<"hello world "<<endl; } //Source1.c #include "source2.h" using namespace std; extern int data; void adddata2() { data = data + 10; } //Source.h #ifndef __SOURCE1_H__ #define __SOURCE1_H__ #include void adddata1(); #endif //Source2.c #include "source1.h" using namespace std; extern int data; void adddata1() { data = data + 100; } //Source2.h #ifndef __SOURCE2_H__ #define __SOURCE2_H__ #include void adddata2(); #endif
多個c文件共用同一個變數(全局變數)
當你聲明一個變數的時候是這樣 unsigned int data = 0;
當你在另一個源文件中想使用這個變數的時候。
只需要加關鍵字:extern unsigned int data;
(註意,這隻是說明這個data是外部的變數,實際上並不分配存儲空間的。也就是不能初始化!)