C C 中怎麼使用Const

2021-05-27 08:20:58 字數 2377 閱讀 2529

c++中的const

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

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

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

也就是說:

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

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

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

例子見

c中的const

問題:const變數& 常量

為什麼我象下面的例子一樣用乙個const變數來初始化陣列,ansic的編譯器會報告乙個錯誤呢?

const int n = 5;

int a[n]; 

答案與分析:

1)、這個問題討論的是「常量」與「唯讀變數」的區別。常量肯定是唯讀的,例如5, 「abc」,等,肯定是唯讀的,因為程式中根本沒有地方存放它的值,當然也就不能夠去修改它。而「唯讀變數」則是在記憶體中開闢乙個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。c語言關鍵字const就是用來限定乙個變數不允許被改變的修飾符(qualifier)。上述**中變數n被修飾為唯讀變數,可惜再怎麼修飾也不是常量。而ansic規定陣列定義時維度必須是「常量」,「唯讀變數」也是不可以的。

2)、注意:在ansic中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而const int n,n只是乙個變數(常量 != 不可變的變數,但在標準c++中,這樣定義的是乙個常量,這種寫法是對的),實際上,根據編譯過程及記憶體分配來看,這種用法本來就應該是合理的,只是ansic對陣列的規定限制了它。

3)、那麼,在ansic 語言中用什麼來定義常量呢?答案是enum型別和#define巨集,這兩個都可以用來定義常量。 

const : c vs. c++的例子

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是乙個不能被改變的普通變數,既然是變數,就要占用儲存空間,所以編譯器不知道編譯時的值.而且,陣列定義時的下標必須為常量.

const int size;

在c語言中,這個語句在是正確的,因為它被c編譯器看作乙個宣告,指明在別的地方分配儲存空間.

但在c++中這樣寫是不正確的.c++中const預設是內部連線,如果想在c++中達到以上的效果,必須要用extern關鍵字.

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

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

c/c++中內連線使用static關鍵字指定.

外連線:所有被編譯過的檔案建立一片單獨儲存空間.一旦空間被建立,聯結器必須解決對這片儲存空間的引用.

全域性變數和函式使用外部連線.

通過extern關鍵字宣告,可以從其他檔案訪問相應的變數和函式.

reference:

const用法大彙總

c c 中const的使用

有時候我們希望定義這樣一種變數,它的值不能被改變。具體的應用如下,直接上 include using namespace std const 使用的好處 合理的利用const,1指標做函式引數,可以有效的提高 可讀性,減少bug 2清楚的分清引數的輸入和輸出特性 struct teacher int...

c c 中const用法總結

const型別定義 指明變數或物件的值是不能被更新,引入目的是為了取代預編譯指令 常量必須被初始化 cons的作用 1 可以定義const常量 例如 const int max 100 int array max 2 便於進行型別檢查 例如 void f const int i 編譯器就會知道i是乙...

C C 中const用法小結

rel file list href file c 5cdocume 7e1 5cadmini 7e1.chi 5clocals 7e1 5ctemp 5cmsohtml1 5c13 5cclip filelist.xml rel file list href file c 5cdocume 7e1...