宏定義(const)和常量定義(#define)的區別

宏定義(const)和常量定義(#define)的區別(轉載)

1.效果-《高質量C++/C編程指南》

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.5,可實際上a的值是3.5原因在於在預處理階段,編譯器將 a = N/2處理成了 a = 2+3/2;這就是宏定義的字符串替換的“邊緣效應”因此要如下定義:#define N (2+3)。const定義表達式沒有上述問題。const定義的常量叫做常變量原因有二:const定義常量像變量一樣檢查類型;const可以在任何地方定義常量,編譯器對它的處理過程與變量相似,只是分配內存的地方不同。
參見:http://www.cnblogs.com/kevinGaoblog/archive/2012/04/16/2452668.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章