- 編寫高質量代碼:改善C程序代碼的125個建議
- 馬偉 著
- 473字
- 2019-01-01 01:33:13
建議6-2:小心使用typedef帶來的陷阱
接下來看一個簡單的typedef使用示例,如下面的代碼所示:
typedef char* PCHAR; int strcmp(const PCHAR, const PCHAR);
在上面的代碼中,“const PCHAR”是否相當于“const char*”呢?
答案是否定的,原因很簡單,typedef是用來定義一種類型的新別名的,它不同于宏,不是簡單的字符串替換。因此,“const PCHAR”中的const給予了整個指針本身常量性,也就是形成了常量指針“char*const(一個指向char的常量指針)”。即它實際上相當于“char*const”,而不是“const char*(指向常量char的指針)”。當然,要想讓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;
不可行的原因是不能聲明多個存儲類關鍵字,由于typedef已經占據了存儲類關鍵字的位置,因此,在typedef聲明中就不能夠再使用static或任何其他存儲類關鍵字了。當然,編譯器也會報錯,如在VC++2010中的報錯信息為“無法指定多個存儲類”。