define巨集常量和const常量的區別

2021-09-07 17:26:29 字數 1220 閱讀 5868

c++ 語言可以用const 來定義常量,也可以用#define 來定義常量。但是前者比後者有更多的優點:

(1) const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤(邊際效應)。

(2) 有些整合化的除錯工具可以對const 常量進行除錯,但是不能對巨集常量進行除錯。規則5-2-1:在c++ 程式中只使用const 常量而不使用巨集常量,即const 常量完全取代巨集常量。

2.實現機制

巨集是預處理命令,即在預編譯階段進行位元組替換。const常量是變數,在執行時const定義的唯讀變數在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態儲存區的唯讀資料區。根據c/c++語法,當你宣告該量為常量,即告訴程式和編譯器,你不希望此量被修改。 程式的實現,為了保護常量,特將常量都放在受保護的靜態儲存區內。凡是試圖修改這個區域內的值,都將被視為非法,並報錯。 這不能理解為凡是字串都是放在靜態儲存區域的。這個跟資料型別沒有關係,而是這個量是變數還是常量的問題。例如,乙個字串變數就是可以被修改的。 這種靜態儲存區域的保護機制是由編譯器實現的,而非儲存該值的記憶體的電器屬性。換言之,實質上記憶體永遠都可以被使用者隨意修改,只是編譯器給使用者的**注入了一些自己的保護**,通過軟體手段將這段記憶體軟保護起來。這種保護在彙編級別可以輕鬆突破,其保護也就無效了。)。

3.用法區別

define巨集定義和const常變數區別:

1.define是巨集定義,程式在預處理階段將用define定義的內容進行了替換。因此程式執行時,常量表中並沒有用define定義的常量,系統不為它分配記憶體。const定義的常量,在程式執行時在常量表中,系統為它分配記憶體。

2.define定義的常量,預處理時只是直接進行了替換。所以編譯時不能進行資料型別檢驗。const定義的常量,在編譯時進行嚴格的型別檢驗,可以避免出錯。

3.define定義表示式時要注意「邊緣效應」,例如如下定義:

#define n 2+3 //我們預想的n值是5,我們這樣使用n,int a = n/2; //我們預想的a的值是2,可實際上a的值是3。原因在於在預處理階段,編譯器將 a = n/2處理成了 a = 2+3/2;這就是巨集定義的字串替換的「邊緣效應」因此要如下定義:#define n (2+3)。const定義的表示式則沒有上述問題。const定義的常量叫做常變數原因有二:const定義常量像變數一樣檢查型別;const可以在任何地方定義常量,編譯器對它的處理過程與變數相似,只是分配記憶體的地方不同。

const常量與 define巨集

define 巨集定義語句 在預處理階段直接做文字替換,不做型別檢查。const c 1 處理時間不同 define所定義的巨集變數在預編譯 預處理 的時候進行替換,const 變數在編譯時確定其值。2 對於 const 變數,系統只在其定義時分配一段記憶體空間,而 define 則是給出了乙個立即...

define巨集常量和const常量的區別

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

define巨集常量和const常量的區別

c 語言可以用const 來定義常量,也可以用 define 來定義常量。但是前者比後者有更多的優點 1 const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤 邊際效應 2 有些整合化的...