在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
以下是const和define的區別:
用#define MAX 255定義的常量是沒有類型的,所給出的是一個立即數,編譯器只是把所定義的常量值與所定義的常量的名字聯系起來,define所定義的宏變量在預處理的時候進行替換,在程序中使用到該常量的地方都要進行拷貝替換;
用const float MAX = 255; 定義的常量有類型名字,存放在內存的靜態區域中,在程序運行過程中const變量只有一個拷貝,而#define 所定義的宏變量卻有多個拷貝,所以宏定義在程序運行過程中所消耗的內存要比const變量的大得多;用define定義的常量是不可以用指針變量去指向的,用const定義的常量是可以用指針去指向該常量的地址的;
用define可以定義一些簡單的函數,const是不可以定義函數的.
具體區別:
編譯器處理方式
define – 在預處理階段進行替換
const – 在編譯時確定其值類型檢查
define – 無類型,不進行類型安全檢查,可能會產生意想不到的錯誤
const – 有數據類型,編譯時會進行類型檢查-
內存空間
define – 不分配內存,給出的是立即數,有多少次使用就進行多少次替換,在內存中會有多個拷貝,消耗內存大
const – 在靜態存儲區中分配空間,在程序運行過程中內存中只有一個拷貝#define PI 3.14159 //常量宏 const doulbe Pi=3.14159; //此時并未將Pi放入ROM中 ...... double i=Pi; //此時為Pi分配內存,以后不再分配! double I=PI; //編譯期間進行宏替換,分配內存 double j=Pi; //沒有內存分配 double J=PI; //再進行宏替換,又一次分配內存!
-
效率
在編譯時, 編譯器通常不為const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
宏替換只作替換,不做計算,不做表達式求解。宏定義的作用范圍僅限于當前文件。
默認狀態下,const對象只在單個文件內有效,當多個文件中出現了同名的const變量時,等同于在不同文件中分別定義了獨立的變量。
如果想在多個文件之間共享const對象,必須在變量定義之前添加extern關鍵字(在聲明和定義時都要加)。