typedef的用法小結

2021-10-16 20:18:45 字數 4333 閱讀 1177

概述是一種在計算機程式語言中用來宣告自定義資料型別,配合各種原有資料型別來達到簡化程式設計的目的的型別定義關鍵字。

typedef用法小結

**一:using typedef to curb miscreant code

typedef 宣告有助於建立平台無關型別,甚至能隱藏複雜和難以理解的語法。不管怎樣,使用 typedef 能為**帶來意想不到的好處,通過本文你可以學習用 typedef 避免缺欠,從而使**更健壯。

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

本文下面將竭盡全力來揭示 typedef 強大功能以及如何避免一些常見的陷阱。

如何建立平台無關的資料型別,隱藏笨拙且難以理解的語法?

使用 typedef 為現有型別建立同義字。

定義易於記憶的型別名

①typedef 使用最多的地方是建立易於記憶的型別名,用它來歸檔程式設計師的意圖。型別出現在所宣告的變數名字中,位於 ''typedef'' 關鍵字右邊。例如:

typedef int size;

此宣告定義了乙個 int 的同義字,名字為 size。注意 typedef 並不建立新的型別。它僅僅為現有型別新增乙個同義字。

你可以在任何需要 int 的上下文中使用 size:

void measure(size * psz);

size array[4];

size len = file.getlength();

②typedef 還可以掩飾符合型別,如指標和陣列。例如,你不用象下面這樣重複定義有 81 個字元元素的陣列:

char line[81];

char text[81];

定義乙個 typedef,每當要用到相同型別和大小的陣列時,可以這樣:

typedef char line[81];

line text, secondline;

getline(text);

③同樣,可以象下面這樣隱藏指標語法:

typedef char * pstr;

int mystrcmp(pstr, pstr);

這裡將帶我們到達第乙個 typedef 陷阱。標準函式 strcmp()有兩個『const char *'型別的引數。因此,它可能會誤導人們象下面這樣宣告 mystrcmp():

int mystrcmp(const pstr, const pstr);

這是錯誤的,按照順序,『const pstr'被解釋為『char * const'(乙個指向 char 的常量指標),而不是『const char *'(指向常量 char 的指標)。這個問題很容易解決:

typedef const char * cpstr;

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

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

鍊錶中的大概應用

name 儲存在結構體單元的name[20] 陣列裡;

typedef struct node

stu; 這是前面定義的結構體變數,乙個單元包含兩個部分,乙個用來儲存name的陣列name[20],乙個用來存放下乙個單元位址的指向結構體node的指標。假設該單元的位址是p,那麼p->name 表示第一部分name[20]的位址,p->link表示第二部分,作用是存放下乙個單元的位址。

c語言中typedef用法

1. 基本解釋

typedef為c語言的關鍵字,作用是為一種資料型別定義乙個新名字。這裡的資料型別包括內部資料型別(int,char等)和自定義的資料型別(struct等)。

在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。

至於typedef有什麼微妙之處,請你接著看下面對幾個問題的具體闡述。

2. typedef & 結構的問題

當用下面的**定義乙個結構時,編譯器報了乙個錯誤,為什麼呢?莫非c語言不允許在結構中包含指向它自己的指標嗎?請你先猜想一下,然後看下文說明:

typedef struct tagnode

*pnode;

答案與分析:

1、typedef的最簡單使用

typedef long byte_4;

給已知資料型別long起個新名字,叫byte_4。

2、 typedef與結構結合使用

typedef struct tagmystruct

mystruct;

這語句實際上完成兩個操作:

1) 定義乙個新的結構型別

struct tagmystruct

;分析:tagmystruct稱為「tag」,即「標籤」,實際上是乙個臨時名字,struct 關鍵字和tagmystruct一起,構成了這個結構型別,不論是否有typedef,這個結構都存在。

我們可以用struct tagmystruct varname來定義變數,但要注意,使用tagmystruct varname來定義變數是不對的,因為struct 和tagmystruct合在一起才能表示乙個結構型別。

2) typedef為這個新的結構起了乙個名字,叫mystruct。

typedef struct tagmystruct mystruct;

因此,mystruct實際上相當於struct tagmystruct,我們可以使用mystruct varname來定義變數。

答案與分析

c語言當然允許在結構中包含指向它自己的指標,我們可以在建立鍊錶等資料結構的實現上看到無數這樣的例子,上述**的根本問題在於typedef的應用。

根據我們上面的闡述可以知道:新結構建立的過程中遇到了pnext域的宣告,型別是pnode,要知道pnode表示的是型別的新名字,那麼在型別本身還沒有建立完成的時候,這個型別的新名字也還不存在,也就是說這個時候編譯器根本不認識pnode。

解決這個問題的方法有多種:

1)、typedef struct tagnode

*pnode;

2)、typedef struct tagnode *pnode;

struct tagnode

;注意:在這個例子中,你用typedef給乙個還未完全宣告的型別起新名字。c語言編譯器支援這種做法。

3)、規範做法:

struct tagnode

;typedef struct tagnode *pnode;

3. typedef & #define的問題

有下面兩種定義pstr資料型別的方法,兩者有什麼不同?哪一種更好一點?

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語句必須寫成 pstr2 s3, *s4; 這這樣才能正常執行。

#define用法例子:

#define f(x) x*x

main( )

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

因為如此原因,在許多c語言程式設計規範中提到使用#define定義時,如果定義中包含表示式,必須使用括號,則上述定義應該如下定義才對:

#define f(x) (x*x)

當然,如果你使用typedef就沒有這樣的問題。

4. typedef & #define的另一例

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

typedef char * pstr;

char string[4] = "abc";

const char *p1 = string;

const pstr p2 = string;

p1++;

p2++;

答案與分析:

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

限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。

Typedef用法小結

1 typedef與基本資料型別 typedef 宣告,簡稱 typedef,為現有資料型別建立乙個新的名字。比如人們常常使用typedef 來編寫更美觀和可讀的 使用 typedef 為現有型別建立同義字。定義易於記憶的型別名。typedef 使用最多的地方是建立易於記憶的型別名,用它來歸檔程式設...

Typedef用法小結

比如定義乙個叫 real 的浮點型別,在目標平台一上,讓它表示最高精度的型別為 typedef long double real 在不支援 long double 的平台二上,改為 typedef double real 在連 double 都不支援的平台三上,改為 typedef float re...

關於typedef的用法總結

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