這個區別用從幾個角度來說:
角度1:
就定義常量說的話:
const 定義的常數是變數 也帶型別, #define 定義的只是個常數 不帶型別。
角度2:
就起作用的階段而言:
define是在編譯的預處理階段起作用,而const是在 編譯、執行的時候起作用。
角度3:
就起作用的方式而言:
define只是簡單的字串替換,沒有型別檢查。而const有對應的資料型別,是要進行判斷的,可以避免一些低階的錯誤。
正因為define只是簡單的字串替換會導致邊界效應,具體舉例可以參考下面**:
#define n 2+3 //我們預想的n值是5,我們這樣使用n
double a = n/2; //我們預想的a的值是2.5,可實際上a的值是3.5
角度4:
就空間占用而言:
例如:
#define pi 3.14 //預處理後 占用**段空間
const float pi=3.14; //本質上還是乙個 float,占用資料段空間
角度5:
從**除錯的方便程度而言:
const常量可以進行除錯的,define是不能進行除錯的,因為在預編譯階段就已經替換掉了
角度6:
從是否可以再定義的角度而言:
const不足的地方,是與生俱來的,const不能重定義,而#define可以通過#undef取消某個符號的定義,再重新定義。
角度7:
從某些特殊功能而言:
define可以用來防止標頭檔案重複引用,而const不能,可以參看下面**:
//主要把以下**放在標頭檔案中,可以防止標頭檔案被重複引用
#ifndef ***//如果沒有定義***
#define ***//定義***
//這裡是你的**
#endif //結束如果
ps: 下面說一下,標頭檔案被重複引用的弊端:
(1) 有些標頭檔案重複引用只是增加了編譯工作的工作量,不會引起太大的問題,僅僅是編譯效率低一些,但是對於大工程而言編譯效率低下那將是一件多麼痛苦的事情。
(2) 有些標頭檔案重複包含,會引起錯誤,比如在標頭檔案中定義了全域性變數(雖然這種方式不被推薦,但確實是c規範允許的)這種會引起重複定義。
角度8:
從某些複雜功能的實現的實現角度來看:
使用define會使得**看起來非常簡單,而const無法實現該功能
例如,mfc在實現六大核心機制中,大量使用了define
1、mfc程式的初始化
2、執行時型別識別(rtti)
3、動態建立
4、永久儲存
5、訊息對映
6、訊息傳遞
比如,在實現rtti功能的時候,定義了如下巨集,**如下:
#define declare_dyncreate(class_name) \
declare_dynamic(class_name)\
static cobject* pascalcreateobject();
const和define的區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...
const和 define的區別
1 const定義的常量是有型別的,define定義的常量是沒有型別的 這就意味著會對前者做乙個型別的檢查,對 define則是做乙個簡單的替換 2 const定義的常量在編譯的時候分配記憶體,而 define定義的常量在預編譯的時候進行替換,不分配記憶體 3 作用域不同,const定義的常變數的作...
const和define的區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...