原文: http://blog.csdn.net/t894690230/article/details/50605021
前言:突然想起很久之前上課時被問及C++ 宏定義與常量的區別,仔細了想了想,並沒有答起(尷尬),這次就簡單總結一下C++宏常量與常量的區別吧。
1. 宏定義
宏定義是C語言提供的三種預處理中的一種,又稱為宏代換、宏替換,簡稱“宏”,用#define定義,如下:
#define Pi 3.1415926
- 1
- 1
宏常量沒有類型,它是在編譯前即預編譯階段進行字符替換,就好比如下的例子:
S = PI * r * r
- 1
- 1
在預編譯階段,直接將PI替換成3.1415926,同時沒有類型安全檢查,系統也不會為它分配內存。
宏定義使用#undef符號終止宏定義的作用域。
2. 常量
常量則是一種標識符,它的值在運行期間恆定不變。常量使用關鍵字const定義,如下:
const float PI = 3.14159;
- 1
- 1
常量是在運行時進行替換,並且在編譯時會進行嚴格的類型檢驗,同時系統也會為常量分配內存。
3. 區別
如上所述,C++語言可以用const 來定義常量,也可以用#define來定義宏常量。但是兩者的區別在於:
- const 常量有數據類型,而宏常量沒有數據類型;
- const 常量在運行時進行替換,宏常量則是在預編譯截斷進行替換,const 常量在編譯階段會進行類型安全檢查,宏常量則不會;
- 有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試。
4. 附錄
在實際使用中,由於宏常量在預編譯時只是進行簡單的字符替換,而不會進行編譯檢查,所有應該特別注意宏常量的使用,譬如如下代碼:
#define N 3 + 2 float a = 2 * N
- 1
- 2
- 3
- 1
- 2
- 3
預想的值應該是a=10,但實際結果卻是a=8,這是因為宏常量N在預編譯階段直接將字符替換,變成了如下代碼:
float a = 2 * 3 + 2
- 1
- 1
這也叫宏定義的“邊緣效應”。
另外根據規則5-2-1:在C++ 程序中只使用const 常量而不使用宏常量,即const 常量完全取代宏常量。