官术网_书友最值得收藏!

建議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中的報錯信息為“無法指定多個存儲類”。

主站蜘蛛池模板: 托克逊县| 大邑县| 汉川市| 海林市| 南城县| 肥城市| 阿拉善右旗| 玉屏| 龙泉市| 雷州市| 临海市| 通化县| 雅安市| 繁昌县| 疏勒县| 郑州市| 连山| 华宁县| 邯郸县| 大港区| 裕民县| 盐城市| 巴塘县| 申扎县| 娱乐| 元氏县| 区。| 房产| 湘西| 浪卡子县| 扶沟县| 武鸣县| 禹城市| 扶余县| 陆良县| 黄梅县| 建宁县| 滨海县| 尼玛县| 崇礼县| 沛县|