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

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

  • const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤(邊際效應)。
  • 有些集成化的調試工具可以對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可以在任何地方定義常量,編譯器對它的處理過程與變量相似,只是分配內存的地方不同。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容