20170726 --iRanMan
我們知道在C語言中使用關鍵詞typedef能帶來很大的好處,但是有些時候這也會帶來一些差錯,本文主要講使用typedef帶來的陷阱。
看一個簡單的typedef使用實例,如下:
typedef char* PCHAR; //定義類型char*爲PCHAR
int strcmp(const PCHAR, const PCHAR);
代碼中的”const PCHAR”是否等價於”const char*” (一個指向常量char的指針)呢?
不是。
typedef是用來定義一種類型的新別名,不同於宏,不是簡單的字符串替換。所以”const PCHAR”中的const給予了整個指針本身常量性,即形成了指向char的常量指針,”char* const”……是不是好拗口?多思考。
說白了,就是char* 是個整體,const 是針對char*,而不是char,相當於”char* const”
如果想要讓”const PCHAR”等價於”const char*”,如下:
typedef const char* PCHAR;
int strcmp(PCHAR,PCHAR);
其實,無論什麼時候,只要爲指針聲明typedef,就應該在最終的typedef名稱中加上const,使得該指針本身就是常量。
需要特別注意的是,雖然typedef不影響對象的存儲特性,但在語法上它是存儲類的關鍵字,如auto, extern, static和register等,而一條指令中不能同時聲明多個存儲類關鍵字,所以typedef static int INT_STATIC
是不可行的。