Cextern宣告和定義問題,c 中的extern修飾符在變數的 宣告和定義方面有什麼作用

2022-03-01 13:33:09 字數 3704 閱讀 3613

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的寫法是不對的,...

宣告失蹤和宣告死亡的定義是什麼,宣告失蹤和宣告死亡的條件是什麼

民抄法通則 第二十條規定 公民下落不明滿二年的,利害關係人可以向人民法院申請宣告他為失蹤人。民法通則 第二十三條 公民有下列情形之一的,利害關係人可以向人民法院申請宣告他死亡 一 下落不明滿四年的 二 因意外事故下落不明,從事故發生之日起滿二年的。戰爭期間下落不明的,下落不明的時間從戰爭結束之日起計...