C和C 關於變數宣告的區別以及乙個矛盾的現象

2021-08-27 01:19:50 字數 1187 閱讀 8542

什麼都不說了,先貼**吧,在vs2010裡面輸入以下**(mac book沒電了(電源不想找,不能在mac os xcode裡面測試了))

file

int ivalue;

file

int ivalue;

file

#include extern int ivalue;

int main()

c語言有如下標準:

當乙個變數在外圍宣告的時候沒有進行初始化,那麼這個變數不能算定義。

比如:int ivalue;這**不算定義,只能算宣告。

根據c標準,以上的a.c和b.c裡面的ivalue只能算宣告,那麼,這個程式在鏈結的時候應該會報錯(沒有找到ivalue的定義),但是,我在vs上面測試的結果表明程式執行成功,並且輸出的結果是0。

相對 c語言的沒有初始化的變數宣告不能算定義而言,c++並不與之一樣地對待,c++有如下規定:

1,進行初始化的變數是定義。如int ivalue= 0;或者extern int ivalue = 0;這就算ivalue的定義(有初始化)。

2,不進行初始化的變數且前面沒有extern關鍵字的變數也是定義。比如int ivalue;就算ivalue的定義,但是,extern int ivalue就只能算宣告了(有extern 關鍵字)。

與c不符合的理由理由:

這個標準之所以與c不符合是因為c++裡面有預設建構函式,比如class ct object,你肯定不能說它是object的宣告。

另外,如果用c++進行編譯,vs2010又符合c++的標準了。

**如下:

pp file

int ivalue;

pp file

int ivalue;

pp file

#include extern int ivalue;

int main()

這**肯定會鏈結失敗,因為根據c++標準,a.cpp和b.cpp裡面的ivalue都是定義,那麼鏈結的時候自然會報重定義錯誤。

提問:

關於上述問題,vs為何與c語言的標準不符合。

C 語法 C 變數宣告和定義的區別

我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下 望我的指點對你受益 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種...

c 變數的宣告和定義

1.變數的定義 變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。2.變數的宣告 用於向程式表明變數的型別和名字。程式中變數可以宣告多次,但只能定義一次 3.定義和宣告的區別 一般的情況下我們常常這樣敘述,把分配記憶體空間的宣告稱之為 定義 把不需要分配記...

C變數的宣告

字元陣列 char p hello p可以指向別的空間,但是不能改變 hello 字串的內容 位址空間為唯讀型 相當於 char const p hello char p hello 不能將p指向別的空間,但可以改變 hello 的內容 在棧上 相當於 char const p hello 在棧上 ...