#define宏常量和const常量的區別

C++ 語言能夠用const 來定義常量,也能夠用#define 來定義常量。可是前者比後者有更多的優勢:
(1) const 常量有數據類型,而宏常量沒有數據類型。編譯器能夠對前者進行類型安全檢查。而對後者只進行字符替換,沒有類型安全檢查,而且在字符替換可能會產生意料不到的錯誤(邊際效應)。
(2) 有些集成化的調試工具能夠對const 常量進行調試,可是不能對宏常量進行調試。規則5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量徹底取代宏常量。c++

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能夠在任何地方定義常量,編譯器對它的處理過程與變量類似,只是分配內存的地方不一樣。編譯

相關文章
相關標籤/搜索