const常量與巨集定義的解析

2021-12-30 02:50:39 字數 1453 閱讀 5626

c語言中的const修飾的變數是唯讀的,本質還是變數,也就是說可以用指標修改該變數的值,並不是真正意義上的常量,它只是告訴編譯器該變數不能出現在賦值號的左邊, 修飾區域性變數時在棧上分配空間,修飾全域性變數在唯讀儲存區分配空間,且該const只在編譯時有效,在執行期無效。

(1).c++語言中const修飾的是真正意義上的常量,碰見const宣告時在符號表中放入常量,編譯時若使用常量則會直接用符號表中的值替換。

(2).編譯時若發現這兩種情況則會給對應的常量分配儲存空間:

①對全域性const常量使用了extern,需要在其他檔案中使用時

②當時用&操作符對const常量取位址時。

注意:c++中的const修飾對應的常量是相容c語言中修飾的變數,但是c++中指標永遠不會使用該常量,使用的是為該常量分配的空間(看後面原始碼剖析)

(3).c++中的const常量類似巨集定義#define

//const常量是被編譯器處理,編譯器會對該常量進行型別和作用域的檢查

const int c = 5;

//巨集定義是被預處理器處理的,使用該常量時只是在字面層面單純的文字替換,沒有型別和作用域

#define c 5

例項剖析:

(1)原始碼

對於const的變化:

const int c = 0;

int *p = (int *)&c;

*p = 5;

printf("c = %d\n", c);

printf("*p = %d\n", *p);

c語言認為:

c++認為:

說明:c語言中const修飾的變數是可以用指標修改它的值的,本質還是使用變數本身;c++中const為真正意義上的常量,指標使用的是它的儲存空間,並不是對應常量本身

(2)原始碼:

說明:c認為該陣列空間大小是乙個變數,所以會報錯

說明:c++認為該陣列空間大小是2個常量的和,還是乙個常量,語法正確,並且能夠編譯執行。注意fun()函式中的巨集定義a能夠在gun()中輸出,說明了巨集定義是全域性的。

const常量與巨集定義區別

1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...

const常量與巨集定義區別

1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...

const定義常量與巨集定義的區別!!!

巨集定義語法格式 define 巨集名稱 巨集值 不加分號,變數名一般設為大寫 巨集的替換與計算 舉乙個例子 define n 3 1 define y n n 1 n 若執行語句 z 2 n y 5 1 後 z 的值為多少?z 2 3 1 3 1 1 5 1 60 巨集的替換在 執行的預編譯階段,...