C++中#define、typedef和const的區別

define

a)#define只是簡單的字符串原地替換,這種替換並不是在編譯階段進行,而是在編譯之前的預處理階段就已經完成了,因此很難發現其中的錯誤及其它的一些問題。(與typedef對比)
b) #define可以像函數一樣,接收參數
#define abs(x) x>0? x:-x (引用自C語言陷阱與缺陷)
調用時:z=abs(a-b)
答案是:a-b>0?a-b:-a-b
上述結果顯然是錯誤的,當a-b<0時應返回-(a-b),而不是-a-b。對上述宏定義做一個簡單修改,即可讓程序正確運行:#define abs(x) (x)>0? (x):-(x)
一定要謹記,#define就是代碼替換,不要對它有任何其它的奢求。因此,C++中提倡用const和inline來替換#define,也不無道理。
c) #define僅是簡單的字符串替換,所替換的字符串並不具備一定的封裝性(與typedef對比)
#define pINT int*
調用時:pINT a,b
相當於:int a,b*,表示定義了一個整形指針變量a和整型變量b
d) #define是個簡單的宏定義,在使用的時候不檢查數據類型。(與const對比)
e) 在大規模的開發過程中,特別是跨平臺和系統的軟件裏,#define最重要的功能是條件編譯。如#ifdef XXX…(#else) …#endif#ifndef XXX … (#else) … #endif等。
如果頭文件包含可以嵌套,那麼C文件就有可能包含多次同一個頭文件,可能出現重複定義的問題的。通過條件編譯開關來避免重複包含(重複定義),如:

        #ifndef __headerfileXXX__
        #define __headerfileXXX__
                …
                文件內容
                …
        #endif

typedef

a) typedef常用來標識一個標識符或關鍵字的別名,是程序編譯過程的一部分,但實際並不分配內存空間
b) typedef並不像#define那樣,不是對字符串(別名)原地擴展,這個別名有一定的封裝性,以致於新命名的標識符具有更易定義變量的功能。
typedef (int ) pINT;*
調用時:pINT a,b
相當於int *a; int *b;,表示定義了兩個整形指針變量,這一點與#define有鮮明的對比。

const

C++中用const聲明的變量是個固定變量,值不能修改;有數據類型;在使用的時候,會檢查數據類型;可以得到這個變量的地址。
借用Lhmily博客中的一句話:const常量是編譯器級別的常量,而#define常量則是真常量

發佈了26 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章