1樓:匿名使用者
我剛才做了一個實驗:
//a.cpp
#include
std::string i;
//b.cpp
#include
#include
extern std::string i;
int main ()
執行結果為:
(上面是一空行:由於末尾用了endl)
如果沒有a.cpp這個檔案,執行出錯
這是一對實驗(有沒有a.cpp檔案)
可得出這樣的結論:
a.cpp中std::string i;是定義(本來就是)
b.cpp中extern std::string i; 則是宣告(你的問題)
先別急,這只是實驗結果。我們還需要理論依據,那麼下面就試著解釋一下:
下面是另一個例子(也是第二個實驗)
你應該知道內建型別(int等)如果作為全域性變數時,定義的同時也就初始化了(一個內建型別有其對應的預設值;如果你將自定義型別也看成內建型別,那麼就等於說,一個自定義型別有其對應的預設值(由預設建構函式完成))。如
//c.cpp
int i;
//d.cpp
#include
extern int i;
int main ()
那麼在這裡int i; 就是定義(並且初始化了i,初始值為0)
因而輸出結果為
0//這個實驗的執行結果符合理論依據。
(我使用的編譯器是visual studio 2008)
從這兩個實驗來看:(將兩個「預設」等同起來)
int i;
std::string i;
都可以作為初始化i的定義性語句。
那麼extern int i;
extern std::string i;
也具有定義行為(這個很明顯與extern的用法相悖)
在以上兩個試驗中:int 與 string 有「區別」嗎?所有的**都一樣只不過把std::
string 換成了 int而已!如果你能解釋int的情況,那麼我想std::string問題也就迎刃而解了!
於是我個人總結出一個結論:
不論是內建型別還是自定義型別,前面有extern關鍵字,如果沒有顯式地初始化引數(即就是自定義型別的預設建構函式被extern遮蔽了,不起初始化的作用),那麼就按宣告對待。
2樓:匿名使用者
全域性變數的定義只能有一個,但是宣告可以有多個,要想引用這個變數,只要包含它的extern宣告就行了。所以:*.
c檔案中變數的定義,在標頭檔案中是變數的extern宣告。別的檔案要想引用這個變數,就包含這個標頭檔案,就有了這個變數的宣告,就可以直接用了。extern告訴編譯器,這只是變數的宣告,定義在別的地方,編譯器就會去別的地方找這個變數,就不會再一次定義這個變數了。
3樓:匿名使用者
extern只是宣告這裡有個變數,在下面的某的地方,我將要用。記憶體沒有給地址給它,如果你定義了,記憶體就會分配地址,並且也進行了初始化,就是它有了個值。
c++中的extern修飾符在變數的 宣告和定義方面有什麼作用
4樓:匿名使用者
extern置於變數或者 函式 前面 ,表示該函式或變數在別的檔案中定義。
還有其它一些連結作用。
具體可以參考:
測試c++部允許我重定義還有extern宣告的變數不能定義
5樓:匿名使用者
extern宣告的變數不能定義;
extern int year; //這是宣告
int year=2008; // 這是定義
6樓:匿名使用者
extern 這個指定連線屬性的 要用於全域性變數
int year=2008;int year;這個肯定不能呀 同一作用域中 不能出現相同名字 你可以試驗 在兩個不同的作用域中定義 發生遮蔽
7樓:匿名使用者
extern int year;
8樓:祥
extern int year;先定義
year=2008;再賦值
c++宣告和定義有什麼區別?
c++中定義變數的時候用extern有什麼用?
9樓:不懂多來問問
extern:這是外部關鍵字。
extern可以置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。
如:你在檔案a中定義了int i;
但你在檔案b中需要用到檔案a中的變數i,這時你在使用變數i之前就需要用extern int i來指定說明這是一個外部變數,這時編譯器就會去其它檔案中查詢。(注意,這個外部變數要是在同一個工程下的不同檔案下,才能使用。如果是不同工程中的檔案就不能這樣引出來)。
外部函式也是這樣來引用的,不同檔案中的函式可以使用extern 關鍵字來引出,c++中函式預設都是外部函式,同一個工程下的不同檔案中的函式也不能重名,因為c++預設函式定義時是外部的,當然可以在定義時改為內部,這樣多個檔案中的函式就不會影響。
但extern 還有另一個用處,那就是先使用後定義。如:你想使用變數i,但你不知道要在什麼地方定義i,這時你就可以使用extern 這個關鍵字來達到先使用變數i,再定義變數i的目的。
10樓:千鋒教育
只有宣告的意思,說明這個變數在別的地方已經定義過了。
一般是全域性變數才會加這個宣告,當然,他們是同一個變數。就好比:
1.cpp檔案定義了一個int a,
2.cpp檔案也定義了一個 int a。
這樣他們就有可能重複定義,如果2.cpp中加上extern那麼就知道2.cpp中的a在其他地方定義過了,和1.cpp是一個變數
11樓:匿名使用者
使用在別的.cpp檔案中已經定義好的全域性變數,其他的不用解釋了吧 還不會的@我吧
12樓:金色潛鳥
一般情況下,不須用extern。
extern 通常指 「外部於本定義域的」,它是全域性量,(寫在本檔案裡 或寫在 另一個檔案裡)
程式例子:
#include
#include
int i=111; // 全域性量 imain();
這裡列印出 什麼?列印出 222
return 0;}
13樓:匿名使用者
表示全域性變數定義在其他檔案中
14樓:
在全域性範圍:
int i;這是定義,定義i,初始化為0。
int i = 1;這是定義,定義i,初始化為1。
extern int i = 1;這是定義,定義i,初始化為1。
extern int i;這是宣告,宣告有一個變數i,它的定義可能在其它檔案中。
每個變數定義只能有一處。最好使每個變數都有且僅有一處定義。
extern int i = 1;作用和int i = 1;沒有區別,只是顯式地提醒程式設計師i可能會在其它檔案裡用到。
c語言自定義函式宣告的問題
你好。請不要使用case作為函式名。case是c保留的關鍵字 include int cas float rate int main void int cas float salary 我想你大概是想要這樣的吧,case是保留關鍵字,不能做自定義函式名 直接上正確的程式,改過的地方已標註。inclu...
int指標變數宣告定義,變數定義和變數宣告的區別
第一句話錯,原因是 int的指標變數p裡可以放空指標或是一個整型值,int型的指標就只能存放int,這裡的null意思是申明p指向空,不是存放空指標。第二局也不對 int 宣告的指標變數裡面放的不應該是一個指標麼?裡面存放的是一個地址,他指向一個int 所以應該p a 你的這種p 5的寫法是不對的,...
宣告失蹤和宣告死亡的定義是什麼,宣告失蹤和宣告死亡的條件是什麼
民抄法通則 第二十條規定 公民下落不明滿二年的,利害關係人可以向人民法院申請宣告他為失蹤人。民法通則 第二十三條 公民有下列情形之一的,利害關係人可以向人民法院申請宣告他死亡 一 下落不明滿四年的 二 因意外事故下落不明,從事故發生之日起滿二年的。戰爭期間下落不明的,下落不明的時間從戰爭結束之日起計...