define和const的區別

2021-09-02 23:26:39 字數 1580 閱讀 3511

這個區別用從幾個角度來說:

角度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巨集僅僅是展開,有多少地方使用,就展開多少...