來源參考: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 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
