typedef是c++++中用于為現(xiàn)有類(lèi)型定義別名的關(guān)鍵字,主要作用是提升代碼可讀性、簡(jiǎn)化復(fù)雜類(lèi)型聲明并增強(qiáng)維護(hù)性。其核心用途包括:1. 簡(jiǎn)化復(fù)雜類(lèi)型的聲明,如結(jié)構(gòu)體、指針或模板類(lèi)型,通過(guò)typedef可減少重復(fù)書(shū)寫(xiě);2. 提高代碼可讀性與可維護(hù)性,通過(guò)有意義的別名明確變量用途,例如用typedef int status表示函數(shù)狀態(tài)返回值;3. 配合結(jié)構(gòu)體和枚舉使用,省略Struct或enum關(guān)鍵字,使代碼更簡(jiǎn)潔;4. 注意typedef并非宏替換,而是編譯階段處理的類(lèi)型別名,且與const結(jié)合時(shí)順序會(huì)影響結(jié)果,此外c++11后可用using替代typedef實(shí)現(xiàn)類(lèi)似功能,尤其在模板類(lèi)型中更為直觀。
typedef 是 C++ 中一個(gè)很實(shí)用的關(guān)鍵字,它的主要用途是給已有的類(lèi)型起一個(gè)新的名字。這在寫(xiě)代碼時(shí)可以提升可讀性、簡(jiǎn)化復(fù)雜類(lèi)型的書(shū)寫(xiě)方式,并且有助于代碼維護(hù)。
比如 unsigned long long 這個(gè)類(lèi)型比較長(zhǎng),如果你頻繁使用它,每次寫(xiě)都挺麻煩的。這時(shí)候就可以用 typedef 給它起個(gè)別名,例如:
typedef unsigned long long ull;
之后你就可以直接用 ull 來(lái)定義變量了:
立即學(xué)習(xí)“C++免費(fèi)學(xué)習(xí)筆記(深入)”;
ull number = 1000000;
一、簡(jiǎn)化復(fù)雜類(lèi)型的聲明
有些類(lèi)型嵌套起來(lái)非常復(fù)雜,比如結(jié)構(gòu)體指針、數(shù)組或者模板類(lèi)型。這個(gè)時(shí)候 typedef 就特別有用了。
舉個(gè)例子,如果你有一個(gè)結(jié)構(gòu)體:
struct Student { int id; char name[50]; };
你想定義多個(gè)這種結(jié)構(gòu)體變量,每次都寫(xiě) struct Student 比較啰嗦。可以用 typedef 簡(jiǎn)化一下:
typedef struct { int id; char name[50]; } Student;
這樣就可以直接寫(xiě):
Student s1, s2;
甚至更進(jìn)一步,如果你想定義指向這個(gè)結(jié)構(gòu)體的指針類(lèi)型,也可以用:
typedef struct { int id; } *PStudent;
然后可以直接用 PStudent 表示結(jié)構(gòu)體指針:
PStudent ps;
二、提高代碼可讀性和可維護(hù)性
通過(guò)給類(lèi)型起有意義的別名,可以讓代碼更容易理解。比如:
typedef int Status;
這樣當(dāng)你看到函數(shù)返回值是 Status 類(lèi)型的時(shí)候,就知道這是用來(lái)表示狀態(tài)的整數(shù),而不是普通的 int。
再比如:
typedef double Coordinate;
這樣在處理坐標(biāo)相關(guān)邏輯時(shí),代碼語(yǔ)義會(huì)更清晰:
Coordinate x, y;
而不是:
double x, y; // 可能不知道這是坐標(biāo)還是其他數(shù)值
三、配合結(jié)構(gòu)體和枚舉一起使用
在定義結(jié)構(gòu)體或枚舉的時(shí)候,通常我們會(huì)同時(shí)定義類(lèi)型別名,這樣就不需要每次都加 struct 或 enum 關(guān)鍵字。
例如定義枚舉:
typedef enum { red, GREEN, BLUE } Color;
之后就可以直接使用:
Color c = RED;
而不是:
enum Color c = RED;
對(duì)于結(jié)構(gòu)體也是一樣,前面的例子已經(jīng)說(shuō)明了這一點(diǎn)。
四、注意幾點(diǎn)常見(jiàn)用法和陷阱
-
typedef 不是宏替換
它是在編譯階段處理的類(lèi)型別名,不是簡(jiǎn)單的文本替換。比如:typedef char* PCHAR;
如果你寫(xiě):
PCHAR a, b;
實(shí)際上等價(jià)于:
char *a, *b;
而不是 char *a, b;(后者只有 a 是指針)
-
typedef 和 const 的順序會(huì)影響結(jié)果
比如:
typedef char* PCHAR; const PCHAR p = NULL;
這里 p 是指向 char 的常量指針,即不能改變指針指向的內(nèi)容,但指針本身可以變。
如果寫(xiě)成:
const char* p;
效果是一樣的。
-
C++11 后還有 using 可以替代 typedef
比如:
using MyInt = int;
在模板類(lèi)型中尤其方便:
using VecOfVec = std::vector<std::vector<int>>;
比 typedef 更直觀一些。
基本上就這些。typedef 雖然看起來(lái)簡(jiǎn)單,但在實(shí)際項(xiàng)目中非常有用,尤其是在封裝復(fù)雜類(lèi)型或做跨平臺(tái)兼容時(shí),用好了能顯著提升代碼質(zhì)量。