c++中 #define和const的區別


來源參考:https://blog.csdn.net/yi_ming_he/article/details/70405364

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

角度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.512

角度4: 就空間占用而言: 例如:

#define PI 3.14     //預處理后 占用代碼段空間

const float PI=3.14;    //本質上還是一個 float,占用數據段空間12

角度5: 從代碼調試的方便程度而言: const常量可以進行調試的,define是不能進行調試的,因為在預編譯階段就已經替換掉了

角度6: 從是否可以再定義的角度而言: const不足的地方,是與生俱來的,const不能重定義,而#define可以通過#undef取消某個符號的定義,再重新定義。

角度7: 從某些特殊功能而言: define可以用來防止頭文件重復引用,而const不能,可以參看下面代碼:

//主要把以下代碼放在頭文件中,可以防止頭文件被重復引用

 

#ifndef xxx//如果沒有定義xxx

#define xxx//定義xxx

//這里是你的代碼

#endif //結束如果1234567

 

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();12345

最后做一下小結: 從上面的各個角度,我們可以看到define和const直接的區別在某個點上同C語言與JAVA語言有一定的相似性,之所以這么說,原因如下: (1) JAVA中內部對象高度封裝,比如對於內存的回收機制而言更是自動完成,不需要程序員多費心;而C語言中,每次我們用指針申請一段空間時,我們都需要仔細考慮,這個指針后面會不會還要使用,現在是不是可以釋放了,會不會成為野指針等等問題,所有的內存相關問題都需要程序員自己考慮,但是好處是,C語言可以直接方便的操作內存,這是一把雙刃劍,用得好事半功倍,用得不好,內存泄漏,指針跑飛,問題到處都是,就算抓到了dump,用windbg也不好分析(特別是跨模塊的情況) (2) C語言和JAVA語言的差異點類比到define和const,我這里只是想強調define的作用非常強大,雖然它沒有類型檢測,不能調試,還要考慮邊界效應,但是正因為沒有類型檢測,預編譯是就完成,才使得它的使用更加靈活,功能更加強大,如果我們可以善用define,往往可以發揮到意想不到的效果。 --------------------- 作者:aaronymhe 來源:CSDN 原文:https://blog.csdn.net/yi_ming_he/article/details/70405364 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM