typedef的用法 維基百科的說法

2021-10-03 17:22:01 字數 4709 閱讀 1091

在c和c++

程式語言中,typedef是乙個關鍵字。它用來對乙個資料型別取乙個別名,目的是為了使原始碼更易於閱讀和理解。它通常用於簡化宣告複雜的型別組成的結構 ,但它也常常在各種長度的整數資料型別中看到,例如size_ttime_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];

在這裡,arrtypechar[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;

struct node ;

在c語言中,可以在一行中宣告複數的變數,不管其是不是指標。不管如何,如果你要宣告指標,必須在每個變數前面加上星號。 在下面的程式碼中,工程師可能會以為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...