14 typedef 用法總結

2021-10-03 09:15:52 字數 4952 閱讀 5128

1、typedef使用示例

typedef int a[10]; typedef void (*p)(void)

typedef int fun();

定義了乙個函式型別fun,所有這個型別的函式都返回乙個int型別的值。

再如:int sum(int a, int b)

return (a + b);

int sub(int a, int b)

return (a - b);

typedef  int calctype(int a, int b); //這樣calctype就成了返回值為int型,接受引數為兩個整數的函式。

int main()

int select = -1;

int result;

int a;

int b;

calctype calculate = ;  

printf("please select calculation type\n");

scanf("%d\n", select);

printf("input two value\n");

scanf("%d %d\n", &a, &b);

if (select == 0 || select == 1)

result = calculate[select](a, b);

return (0);

2、使用解釋

1)示例

int a[20]<=>int a=new int[20]  //意思是開闢int型的20個位址空間給a,a的型別是a。

typedef char sstring[max]<=>typedef char[max] sstring //這樣,sstring就可以定義一維字元型陣列了。

如:sstring s1<=>char s1[max]。

這樣,我們再理解剛才上面提到的問題:

typedef int a[10]<=>typedef int[10] a //也就是說a可以去定義一唯整形陣列了。 

typedef void (*p)(void) <=>typedef void(*)(void)  p //可以用p去定義指向返回值為空值,引數也為空值的函式了。

typedef int fun() <=> typedef int() fun //意思是fun可以去定義返回值為int型的函式了。

總之,相當於定義別名,其值為表示式中除去新別名後的表示式。

2)使用typedef為現有型別建立同義字,定義易於記憶的型別名 

typedef原型別名 替換型別名;

typedef char * pstr;

int mystrcmp(pstr, pstr);

注意:標準函式 strcmp()有兩個『const char *'型別的引數。 『const pstr'被解釋為『char * const'(乙個指向 char的常量指標),而不是『const char *'(指向常量 char的指標)。

typedef const char * cpstr;

int mystrcmp(cpstr, cpstr); //現在是正確的 

記住:不管什麼時候,只要為指標宣告 typedef,那麼都要在最終的 typedef名稱中加乙個const,以使得該指標本身是常量,而不是物件。 

3)**簡化 

上面討論的typedef行為有點像 #define巨集,用其實際型別替代同義字。不同點是 typedef在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文字替換。例如: 

typedef int (*pf) (const char *, const char *);

這個宣告引入了 pf型別作為函式指標的同義字,該函式有兩個 const char *型別的引數以及乙個 int型別的返回值。

再如一下面的三個例子(將複雜的式子用typedef簡化):

對複雜變數建立乙個型別別名的方法很簡單,你只要在傳統的變數宣告表示式裡用型別名替代變數名,然後把關鍵字typedef加在該語句的開頭就行了。 

(1)int *(*a[5])(int, char*);如下轉化表達:

typedef int *(*pfun)(int, char*); //pfun是我們建的乙個型別別名

pfun a[5]; //使用定義的新型別來宣告物件,等價於int* (*a[5])(int, char*);

(2)void (*b[10])(void (*)());

typedef void (*pfunparam)(); //首先為上面表示式斜體加粗部分宣告乙個新型別

typedef void (*pfun)(pfunparam); //整體宣告乙個新型別

pfun b[10]; //使用定義的新型別來宣告物件,等價於void (*b[10]) (void (*)());

(3)doube(*)() (*pa)[9]; //首先為上面表示式斜體加粗部分宣告乙個新型別

typedef double(*pfun)(); //整體宣告乙個新型別

typedef pfun (*pfunparam)[9]; //使用定義的新型別來宣告物件,等價於doube(*)() (*pa)[9];

pfunparam pa;

4)促進跨平台開發

typedef有另外乙個重要的用途,那就是定義機器無關的型別,例如,你可以定義乙個叫real的浮點型別,在目標機器上它可以自動獲得最高的精度: 

typedef long double real;

在不支援 long double的機器上,該 typedef看起來會是下面這樣: 

typedef double real;

並且,在連 double都不支援的機器上,該 typedef看起來會是這樣:

typedef float real;

在大多數情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現。標準庫廣泛地使用 typedef來建立這樣的平台無關型別:

size_t,ptrdiff和 fpos_t就是其中的例子。此外,象 std::string和 std::ofstream這樣的 typedef還隱藏了長長的,難以理解的模板特化語法,例如:basic_string,allocator>和 basic_ofstream>。  

5)typedef與#define的比較

(a)他們的不同:

我們以例子進行。

例一: 

typedef char *pstr;

#define pstr char *;

通常講,typedef要比#define要好,特別是在有指標的場合:

typedef char *pstr1;

#define pstr2 char *;

pstr1 s1, s2;

pstr2 s3, s4;

在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指標變數,根本原因就在於#define只是簡單的字串替換而typedef則是為乙個型別起新名字。 

#define用法的乙個例子: 

#define f(x) x*x

main( )

int a=6,b=2,c; 

c=f(a) / f(b); 

printf("%d \\n",c); 

以下程式的輸出結果是: 36,出錯。 

在許多c語言程式設計規範中提到使用#define定義時,如果定義中包含表示式,必須使用括號:#define f(x) (x*x),這樣才有正確結果。當然,使用typedef就沒有這樣的問題。 

例二:下面的**中編譯器會報乙個錯誤,你知道是哪個語句錯了嗎? 

typedef char * pstr;

char string[4] = "abc";

const char *p1 = string;

const pstr p2 = string;

p1++;

p2++;

是p2++出錯了。上述**中const pstr p2並不等於const char * p2,不是簡單的替換。const pstr p2和const long x本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。

(b)#define與typedef引申談 

1) #define巨集定義的特別長處:可使用 #ifdef ,#ifndef等來進行邏輯判斷,使用#undef來取消定義。 

2) typedef的特別長處:它符合範圍規則,使用typedef定義的變數型別其作用範圍限制在所定義的函式或者檔案內(取決於此變數定義的位置),而巨集定義則沒有這種特性。 

6)typedef與儲存關鍵字

typedef就像 auto,extern,mutable,static,和 register一樣,是乙個儲存類關鍵字。這並不是說 typedef會真正影響物件的儲存特性;它只是說在語句構成上,typedef宣告看起來象 static,extern等型別的變數宣告。

第二個陷阱: 

typedef register int fast_counter; //錯誤 

編譯通不過。問題出在你不能在宣告中有多個儲存類關鍵字。因為符號 typedef已經佔據了儲存類關鍵字的位置,在 typedef宣告中不能用 register(或任何其它儲存類關鍵字)。

4、static

static修飾變數和修飾函式的意義是不同的(作用域與生成期)。

修飾變數是把該變數的作用與限制在某一範圍內,這個範圍可以是模組範圍、函式範圍、類範圍、復合語句範圍,但其生存期從進入其有效範圍開始到程式執行結束。

static修飾函式時,是把這個函式的有效範圍限制在定義他的模組內。

typedef宣告有助於建立平台無關型別,甚至能隱藏複雜和難以理解的語法。

typedef宣告,簡稱 typedef,為現有型別建立乙個新的名字。比如人們常常使用 typedef來編寫更美觀和可讀的**。所謂美觀,意指 typedef能隱藏笨拙的語法構造以及平台相關的資料型別,從而增強可移植性和以及未來的可維護性。

typedef用法總結

typedef,為現有資料型別建立乙個新的名字。typedef使用最多的就是建立易於記憶的型別名。型別出現在所宣告的變數名字中。例如typedef int size 此處宣告定義了乙個int的同義字,名字為size。主義typedef並不是建立新的型別。它僅僅是為現有型別新增乙個同義字,你可以在任何...

Typedef 用法總結

不管實在c還是c 中,typedef這個詞都不少見,當然出現頻率較高的還是在c 中。typedef與 define有些相似,但更多的是不同,特別是在一些複雜的用法上,就完全不同了,看了網上一些c c 的學習者的部落格,其中有一篇關於typedef的總結還是很不錯,由於總結的很好,我就不加修改的引用過...

typedef用法總結

define 是簡單的字串替換,相比 define,typedef可以用來定義乙個新型別,在c程式中比較常見。下面總結一下typedef的常用方法。1 定義一種型別,方便多多平台使用。如平台一 typedef long double real 平台一 typedef double real 平台一 ...