const在c c 中區別

2021-06-27 10:58:27 字數 3042 閱讀 8960

c++中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在**中.所以,以下**:

#include

using namespace std;

int main()

;for (int i = 0; i < sizeof array / sizeof *array; i++)

}在可以通過編譯,並且正常執行.但稍加修改後,放在c編譯器中,便會出現錯誤:

#include

int main()

; for (i = 0; i < sizeof array / sizeof *array; i++)

}錯誤訊息:

c:/test1/te.c(8): error c2057: 應輸入常數表示式

c:/test1/te.c(8): error c2466: 不能分配常數大小為 0 的陣列

出現這種情況的原因是:

在c中,const是乙個不能被改變的普通變數,既然是變數,就要占用儲存空間,所以編譯器不知道編譯時的值.而且,陣列定義時的下標必須為常量.

在c語言中:

const int size;

這個語句是正確的,因為它被c編譯器看作乙個宣告,指明在別的地方分配儲存空間.但在c++中這樣寫是不正確的.c++中const預設是內部連線,如果想在c++中達到以上的效果,必須要用extern關鍵字.

c++中,const預設使用內部連線.而c中使用外部連線.

內連線:編譯器只對正被編譯的檔案建立儲存空間,別的檔案可以使用相同的表示符

或全域性變數.c/c++中內連線使用static關鍵字指定.

外連線:所有被編譯過的檔案建立一片單獨儲存空間.一旦空間被建立,聯結器必須解決對這片儲存空間的引用.全局變數和函式使用外部連線.通過extern關鍵字宣告,可以從其他檔案訪問相應的變數和函式.

*******************************c++************************************

header.h

const int test = 1;

test1.cpp

#include

#include "header.h"

using namespace std;

int main()

test2.cpp

#include

#include "header.h"

using namespace std;

void print()

以上**編譯連線完全不會出問題,但如果把header.h改為:

externconst int test = 1;

在連線的時候,便會出現以下錯誤資訊:

test2 error lnk2005: "int const test" (?test@@3hb

) 已經在 test1.obj 中定義

因為extern關鍵字告訴c++編譯器test會在其他地方引用,所以,c++編譯器就會為test建立儲存空間,不再是簡單的儲存在名字表裡面.所以,當兩個檔案同時包含header.h的時候,會發生名字上的衝突.

此種情況和c中const含義相似:

header.h

const int test = 1;

test1.c

#include

#include "header.h"

int main()

test2.c

#include

#include "header.h"

void print()

錯誤訊息:

test3 fatal error lnk1169: 找到乙個或多個多重定義的符號

test3 error lnk2005: _test 已經在 test1.obj 中定義

c++中,是否為const分配空間要看具體情況.

如果加上關鍵字extern或者取const變數位址,則編譯器就要為const分配儲存空間.

c++中定義常量的時候不再採用define,因為define只做簡單的巨集替換,並不提供型別檢查.

**:const物件預設為檔案的區域性變數,與其他變數不同,除非特別說明,在全域性作用域的const變數時定義該物件的檔案區域性變數。此變數只存在於那個檔案中中,不能別其他檔案訪問。要是const變數能在其他檔案中訪問,必須顯示的指定extern(c中也是)

當你只在定義該const常量的檔案中使用該常量時,c++不給你的const常量分配空間--這也是c++的一種優化措施,沒有必要浪費記憶體空間來儲存乙個常量,此時const   int   c =   0;相當於#define   c   0;  

當在當前檔案之外使用時,c++會給你的const分配空間(它是迫不得已)。因為若此時如果不分配空間,則obj中根本就不會有該常量的資訊。連線的時候就找不到該常量。同樣如果你在程式中取了常量的位址,也回迫使c++給你的常量分配空間。

c++編譯器在通常情況下不為常量分配空間,而是將其值存放在符號表內.但當使用extern修飾常量時,則必須立即為此常量分配空間(與之類似的情況還有取常量的位址等等).只所以必須分配空間,是因為extern表示"使用外部鏈結",   這表明還會有其他的編譯單元將會使用定址的方法來引用它,因此它現在就必須擁有自己的位址.

所以如果想在當前檔案使用其他檔案的const變數時,這個變數就必須定義成:(m.cpp) extern const int aaa = 9999;使用時需要:(main.cpp) extern const int aaa;在c中就不必再定義是加extern,因為始終為const變數分配空間

其他參考:

const在C和C 中區別

c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i sizeof array sizeof a...

const在c c 中的區別

c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以,以下 include using namespace std int main for int i 0 i sizeof array sizeof a...

在WPF中區別TextBlock和Label

textblock和label都是用來顯示少量資料的。好多文章對label存在的描述都是它允許使用 快速獲取 快速獲取 就是允許你用alt加上其它的按鍵快速和ui介面的某個控制項互動,比如你可以用alt加上o鍵來點選乙個ok按鈕。textblock直接繼承於frameworkelement,而lab...