程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 淺談C++ extern聲明

淺談C++ extern聲明

編輯:C++入門知識

初出茅廬,正在學習C++的路上,只是這條路還一直在施工,呵呵。這幾天回頭復習下基礎知識,對extern在《C++ primer》書中的定義理解不是很透徹,又和朋友探討了一下,於是我們打算實踐一下來幫助理解。下面我就來說說實踐中的感受吧~

引用《C++ primer》書中對extern的說明:

extern聲明不是定義,也不分配空間。事實上,它只是說明變量定義在程序的其他地方。程序中變量可以聲明多次,但只能定義一次。

任何在多個文件中使用的變量都需要有與定義分離的聲明。在這種情況下,一個文件含有變量的定義,使用該變量的其他文件則包含該變量的聲明(而不是定義)。

看到這裡,我不禁有幾個疑惑:

下面我進行了一翻實踐,首先創建a.h頭文件,代碼如下:

int a = 1;

接著,創建main.cpp文件,代碼如下:

#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。代碼如下:

int 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變量,其他代碼不變。代碼如下:

#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上它只是說明變量定義在程序的其他地方的意思,這些教材上很多翻譯過來的話都非常專業,讓初學者很難理解真正的目的,最後呢,請各種大神,高手手下留情。如有錯誤或者意見,歡迎私信或者評論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved