const 在c和c 中的區別

2021-05-01 03:00:28 字數 2807 閱讀 7289

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的時候,會發生名字上的衝突.

此種情況和cconst含義相似:

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在C和C 中的區別

1,怎麼理解const?2,const在c和c 中的區別?const修飾的變數不能夠在作為左值,也就是說一旦被初始化後,值不可以被修改。在.c檔案中,const修飾的量,可以不用初始化,但是如果不初始化,那也就沒有機會給被修飾量進行賦值。c語言中const修飾的量不叫常量,而叫做常變數,和普通變數的...

const在C和C 中的區別

在c中,const不是常量,只能說是乙個不能改變的變數 注意是變數 c編譯器不能把const看成乙個編譯期間的常量,因為他在記憶體中有分配,c編譯器不知道他在編譯期間的值。所以不能作為陣列定義時的下標,因為它必須為常量。在c中,const int a 是可以的,因為這只是宣告乙個變數,告訴編譯器,我...

const在C與C 中的區別

const修飾的變數稱為常變數,在編譯階段,判斷其有沒有做左值,其他用法與普通變數一樣。普通變數存放資料在執行階段才能知道 const修飾的變數稱為常量,也是在編譯階段,將常量出現的地方替換為相應初始化的值 1.常量不能修改 直接與間接 2.const 修飾全域性變數是將其變為local 3.必須初...