最近看scintillia的源**,總看到typedef的身影,朋友也說autodesk的面試官曾說過不懂typedef很差勁。於是查了網上的資料,看了幾種比較
容易出錯的常用用法,做了一些整理。
一.起別名的兩種用法
1. typedef (
int*
) pint;
2. typedef pint (
int*
)比如pint a,b;
第一種表示: int*a;int*b;
第二種表示: int*a,b;
所以第一種更像乙個型別,第二種更像巨集。
二.舊式**中宣告物件
typedef
struct
tagpoint
point a,b;
三.**簡化
為複雜的宣告定義乙個新的簡單的別名
方法:在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版
typedef
int(
*pf) (
const
char*,
const
char*);
這個宣告引入了 pf 型別作為函式指標的同義字,該函式有兩個 const char * 型別的引數以及乙個 int 型別的返回值。
如果要使用下列形式的函式宣告,那麼上述這個 typedef 是不可或缺的:
pf register(pf pf);
int(*
register (
int(
*pf)(
const
char*,
const
char
*)))(
const
char*,
const
char
*);
剛剛看了一篇也是關於typedef用法的文章,跟先前看的那篇文章內容大同小異,不過有一處讓我收穫不小,就是在上篇最後那個案例我不理解的地方,這篇文章給了乙個很好的答案。以下是文章的部分內容 :
陷阱一:
記住,typedef是定義了一種型別的新別名,不同於巨集,它不是簡單的字串替換。比如:
先定義:
typedef char* pstr;
然後:
int mystrcmp(const pstr, const pstr);
const pstr實際上相當於const char*嗎?不是的,它實際上相當於char* const。
原因在於const給予了整個指標本身以常量性,也就是形成了常量指標char* const。
陷阱二:
typedef在語法上是乙個儲存類的關鍵字(如auto、extern、mutable、static、register等一樣),雖然它並不真正影響物件的儲存特性,如:
typedef static int int2; //不可行
編譯將失敗,會提示「指定了乙個以上的儲存類」。
typedef用法小結
typedef用於定義型別的同義詞,但實現機制和簡單的巨集轉換是不一樣的。例如 include using namespace std typedef int pint int main 這裡的pint pa,pb就相當於int pa pb,而不是int pa,pb typedef主要用於這幾種目的...
C C 基礎知識 typedef用法小結
第 一 包含四個用途 用途一 定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如 char pa,pb 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,和乙個字元變數 以下則可行 typedef char pchar 一般用大寫 pchar pa,pb 可行...
常見typedef 用法
例如 typedef unsigned char uchar 描述 uchar等價於unsigned char型別定義 uchar c宣告等於unsigned char c宣告 2.陣列型別定義 例如 typedef int array 2 描述 array等價於 int 2 定義 array a宣...