先上一個典型程式:
#include<iostream>
using namespace std;
int main()
{
int num = 1;
#define t1 num + num
#define t2 t1 % t1
cout << "t2 is " << t2 << endl; // t2 is 2
const int s1 = num + num;
const int s2 = s1 % s1;
cout << "s2 is " << s2 << endl; // s2 is 0
return 0;
}
運作結果如注釋所示,分别得到“t2 is 2”、“s2 is 0”???
分析原因:const定義的常量s1、s2,則s1的值是num+num,s2的值是s1%s1,是以最後結果為“s2 is 0”;而define定義的變量作替換後,C++把cout<<"t2 is "<<t2<<endl;語句譯成了:cout<<"t2 is "<<num+num%num+num<<endl;是以結果為“t2 is 2”(1+0+1=2)
具體分析define與const的差別,如下定義:
const float PI = 3.14;
#define PI 3.14
(1)類型的安全性檢查:const常量有資料類型,而define定義宏常量沒有資料類型。則編譯器可以對前者進行類型安全檢查,而對後者隻進行字元替換,沒有類型安全檢查(字元替換時可能會産生意料不到的錯誤,如上面的程式所示);
(2)調試:部分排程工具可以對const常量進行排程,但不能對宏常量進行排程;
(3)編譯器的處理方式不同:define宏是在預處理階段展開,const常量則是編譯運作階段使用;
(4)存儲方式不同:define宏僅僅是展開,有幾個地方使用則展開幾次,不配置設定記憶體;const常量會在記憶體中配置設定位址(可以是堆中也可以是棧中);
(5)效率:define定義的常量在記憶體中有若幹個拷貝;const定義的常量在程式運作過程中隻有一份拷貝,甚至不為普通const常量配置設定存儲空間,而是将它們儲存在符号表中,相當于沒有了讀記憶體的操作,使得效率也很高