初出茅廬,正在學習C++的路上,只是這條路還一直在施工,呵呵。這幾天回頭復習下基礎知識,對extern在《C++ primer》書中的定義理解不是很透徹,又和朋友探討了一下,於是我們打算實踐一下來幫助理解。下面我就來說說實踐中的感受吧~
引用《C++ primer》書中對extern的說明:
extern聲明不是定義,也不分配空間。事實上,它只是說明變量定義在程序的其他地方。程序中變量可以聲明多次,但只能定義一次。
任何在多個文件中使用的變量都需要有與定義分離的聲明。在這種情況下,一個文件含有變量的定義,使用該變量的其他文件則包含該變量的聲明(而不是定義)。
看到這裡,我不禁有幾個疑惑:
下面我進行了一翻實踐,首先創建a.h頭文件,代碼如下:
1int
a = 1;
接著,創建main.cpp文件,代碼如下:
1 2 3 4 5 6 7 8 9 10#include <iostream>
using
namespace
std;
int
main()
{
extern
int
a;
cout<<a<<endl;
system
(
"pause"
);
//用於暫停窗口以看清輸出結果
return
0;
}
輸出的結果是1,說明extern聲明時是可以定義變量的,同時也解答了第二個問題,extern是跨文件的,不需要引用a.h頭文件。
接下來,我們創建b.h頭文件,同樣定義一個相同變量a。代碼如下:
1int
a = 2;
結果編譯器提示報錯,報錯內容為:
1>main.obj : error LNK2001: 無法解析的外部符號 "int a" (?a@@3HA)
1>E:\Program\c++\練習\cpptest\Debug\cpptest.exe : fatal error LNK1120: 1 個無法解析的外部命令
得到一個這麼奇葩的報錯提示,我個人認為原因應該是編譯器不知道引用哪一個變量a,我們必須指引程序去引用一個變量a。
解決方法可以通過引用需要的那個頭文件。
最後,我們在int main()函數中定義一個a變量,其他代碼不變。代碼如下:
1 2 3 4 5 6 7 8 9 10 11#include <iostream>
using
namespace
std;
int
main()
{
extern
int
a;
int
a = 2;
cout<<a<<endl;
system
(
"pause"
);
//用於暫停窗口以看清輸出結果
return
0;
}
結果是編譯器提示報錯,報錯內容為:“int a”: 重定義。
其實extern的作用就是在此處引用了頭文件中的定義,使其能夠引用其他文件中的全局變量a,相當於把全局變量變成了函數中可用的局部變量。如果將“extern int a;”這行代碼刪除,那麼輸出結果則為2。
總結:經過自己的實踐,我終於明白了extern引用是怎麼一回事,也明白了primer上它只是說明變量定義在程序的其他地方的意思,這些教材上很多翻譯過來的話都非常專業,讓初學者很難理解真正的目的,最後呢,請各種大神,高手手下留情。如有錯誤或者意見,歡迎私信或者評論。