在c和c++
程式語言中,typedef
是乙個關鍵字。它用來對乙個資料型別取乙個別名,目的是為了使原始碼更易於閱讀和理解。它通常用於簡化宣告複雜的型別組成的結構 ,但它也常常在各種長度的整數資料型別中看到,例如size_t
和time_t
。
typedef
的語法是 :typedeftypedeclaration;
建立length
作為int
的別名 :
typedef int length;建立
pfi
作為乙個指向 "乙個擁有兩個char *
當作引數並回傳int
的函式" 的指標的別名
typedef int (*pfi)(char *, char *);
typedef
會被用來指定一種資料型別的意義。
例如 : 以下示範乙個普通的宣告,速度及分數都被宣告為int
int current_speed ;此處使用者定義乙個資料型別int high_score ;
void congratulate(int your_score)
;
var
。
像這樣建立乙個var
型別的變數,程式碼必須寫為(注意,在 c++ 中宣告乙個struct
時,同時也隱含了typedef
,c 則沒有):
struct var a;在例子的最末處加入一行語句:
typedef struct var newtype;現在要建立型別
var
的變數時,程式碼可以寫為:
newtype a;這樣就更容易閱讀了,因為不用再為每乙個 var 型別的變數加上關鍵字
struct
。
也可以給陣列使用typedef
宣告。
typedef basetype newtype [arrsize];這樣就可以在宣告乙個
basetype
型別和arrsize
大小的新陣列時,將程式碼寫為:
newtype array;
typedef
可以簡單的跟陣列一起使用。例如 :
typedef char arrtype[6]; // type name: arrtype在這裡,// new type: char[6]
arrtype arr=; // same as: char arr[6]=
arrtype *parr; // same as: char (*parr)[6];
arrtype
是char[6]
的別稱。而arrtype *parr;
則表示parr
是乙個指向儲存char[6]
型別記憶體的指標。
可以使用typedef來定義乙個新的指標型別 :
typedef int *intptr; // type name: intptr在上面那段程式碼中,// new type: int*
intptr ptr; // same as: int *ptr
intptr
是乙個 指標型態int*
的 新的別名。intptr ptr;
宣告了乙個變數(ptr
),其資料型別是int*
。如此一來ptr
就是乙個 可以指向一段儲存int
資料的記憶體 的指標了。 使用typedef
來定義乙個新的指標型別有時候會造成一些困惑 :
typedef int *intptr;在上面的程式碼中,intptr cliff, allen; // both cliff and allen are int* type
intptr cliff2, *allen2; // cliff2 is int* type, but allen2 is int** type
// same as: intptr cliff2;
// intptr *allen2;
ntptr cliff, allen;
表示宣告兩個變數,其資料型別是int*
,而intptr *allan2
則使allen2
的型別成為int**
typedef
可以跟結構體
指標一起使用。如下 :
struct node ;使用
typedef
可以改寫成如下 :
typedef struct node node;在c語言中,可以在一行中宣告複數的變數,不管其是不是指標。不管如何,如果你要宣告指標,必須在每個變數前面加上星號。 在下面的程式碼中,工程師可能會以為struct node ;
errptr
是乙個指標,這個能會引起一些錯誤。
struct node *startptr, *endptr, *curptr, *prevptr, errptr, *refptr;如果你用
typedef
定義乙個node *
,這可以保證所有的變數都是乙個指向乙個structure type
的指標。
typedef struct node* nodeptr;先看看以下這段尚未使用...nodeptr startptr, endptr, curptr, prevptr, errptr, refptr;
typedef
的程式碼:
int do_math(float arg1, int arg2)這段程式碼可以被改寫成如下:int call_a_func(int (*call_this)(float, int))
int final_result = call_a_func(&do_math);
typedef int (*mathfunc)(float, int);在這裡,int do_math(float arg1, int arg2)
int call_a_func(mathfunc call_this)
int final_result = call_a_func(&do_math);
mathfunc
是乙個指標,指向乙個回傳int
並以乙個float
和乙個int
作為引數使用的函式。當乙個函式被當作引數使用時,如果少了typedef
它可能會變得難以了解。 以下是signal(3)
(來自freebsd)的函式原型:
void (*signal(int sig, void (*func)(int)))(int);上面宣告的函式相當的神秘,因為它沒有清楚的顯示它以什麼函式當作引數,或回傳了什麼資料型別。乙個初心者工程師甚至可能以為它接收乙個
int
作為引數,並不回傳任何東西。但它其實接收了乙個int
和乙個function pointer
作為引數,並回傳了乙個function pointer
。它可以被改寫成以下程式碼:
typedef void (*sighandler_t)(int);sighandler_t signal(int sig, sighandler_t func);
typedef
同時可以用來型別轉換。例如:
typedef int (*funcptr)(double); // pointer to function taking a double returning int左側,funcptr x = (funcptr) null; // c or c++
funcptr y = funcptr(null); // c++ only
funcptr z = static_cast(null); // c++ only
funcptr
用來宣告變數;右側,funcptr
則用來轉換值的型態。 如果少了typedef
,替換使用宣告語法和型別轉換語法是幾乎不能做到的。例如:
void *p = null;int (*x)(double) = (int (*)(double)) p; // this is legal
int (*)(double) y = (int (*)(double)) p; // left-hand side is not legal
int (*z)(double) = (int (*p)(double)); // right-hand side is not legal
WIKI 維基百科
今天.我又了解了乙個新的東東.wiki.wiki一詞源自夏威夷語的 wee kee wee kee 本是 快點快點 之意。在這裡wiki指的是一種超文字系統,系支援那些面向社群的協作式寫作,同時也包括一組支援這種寫作的輔助工具。有人認為,wiki系統屬於一種人類知識的網路系統,我們可以在web的基礎...
DevOps 維基百科
3 月,跳不動了?devops development和operations的組合詞 是一種重視 軟體開發人員 dev 和 it運維技術人員 ops 之間溝通合作的文化 運動或慣例。透過自動化 軟體交付 和 架構變更 的流程,來使得構建 測試 發布軟體能夠更加地快捷 頻繁和可靠。1 可以把devop...
OpenMP 維基百科,自由的百科全書
openmp 維基百科,自由的百科全書 維基百科,自由的百科全書 跳轉到 導航 搜尋openmp open multi processing 是由openmp architecture review board牽頭提出的,並已被廣泛接受的,用於共享記憶體並行系統的多執行緒程式設計的一套指導性注釋 c...