天天看點

《編寫高品質代碼:改善c程式代碼的125個建議》——建議6-2:小心使用typedef帶來的陷阱

本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第1章,建議6-2,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

接下來看一個簡單的typedef使用示例,如下面的代碼所示:

在上面的代碼中,“const pchar”是否相當于“const char *”呢?

答案是否定的,原因很簡單,typedef是用來定義一種類型的新别名的,它不同于宏,不是簡單的字元串替換。是以,“const pchar”中的const給予了整個指針本身常量性,也就是形成了常量指針“char const(一個指向 char 的常量指針)”。即它實際上相當于“char const”,而不是“const char (指向常量 char 的指針)”。當然,要想讓const pchar相當于const char 也很容易,如下面的代碼所示:

其實,無論什麼時候,隻要為指針聲明 typedef,那麼就應該在最終的 typedef 名稱中加一個 const,以使得該指針本身是常量。

還需要特别注意的是,雖然typedef并不真正影響對象的存儲特性,但在文法上它還是一個存儲類的關鍵字,就像 auto、extern、static和 register 等關鍵字一樣。是以,像下面這種聲明方式是不可行的:

不可行的原因是不能聲明多個存儲類關鍵字,由于typedef 已經占據了存儲類關鍵字的位置,是以,在 typedef 聲明中就不能夠再使用 static或任何其他存儲類關鍵字了。當然,編譯器也會報錯,如在vc++ 2010中的報錯資訊為“無法指定多個存儲類”。

繼續閱讀