日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

typedef 深入剖析

發(fā)布時(shí)間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 typedef 深入剖析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

typedef是一個(gè)我們常常會(huì)用到的關(guān)鍵字,而這個(gè)關(guān)鍵字有許多陷阱或者說(shuō)許多不為我們深入理解的地方。很多書上都是很簡(jiǎn)單地一筆代過(guò),并沒(méi)有真正地讓我們理解這個(gè)關(guān)鍵字。本文對(duì)其進(jìn)行詳細(xì)地說(shuō)明。
綜合網(wǎng)絡(luò)上找到的資料對(duì)其進(jìn)行分析,這其中會(huì)涉及到一些其他c方面的內(nèi)容(比如指針,指向函數(shù)的指針,編譯時(shí)候數(shù)據(jù)類型未定義與完全定義知識(shí)等等),看到這些內(nèi)容的時(shí)候大家可以忽略,這個(gè)重點(diǎn)是在typedef。
好了,不說(shuō)那么多開始吧。
 
<h4>typedef的定義</h4>
&nbsp;
typedef 是一個(gè)關(guān)鍵字,后面是數(shù)據(jù)類型和標(biāo)識(shí)符。標(biāo)識(shí)符或類型名并沒(méi)有引入新的類型,而只是現(xiàn)有數(shù)據(jù)類型的同義詞。
它用來(lái)對(duì)一個(gè)類型起一個(gè)新名字,也用來(lái)聲明自定義數(shù)據(jù)類型,其實(shí)給一個(gè)類型起新名字的作用也包含在聲明自定義數(shù)據(jù)類型這個(gè)功能中。

1.給一個(gè)類型起一個(gè)新名字

給一個(gè)類型其新名字,有時(shí)候可以幫助我們更好地記憶。

例子:

<pre lang="c" escaped="true">typedef int inter;</pre>


此聲明定義了一個(gè) int 的同義字,名字為 inter。注意 在這里typedef 并不創(chuàng)建新的類型。它僅僅為現(xiàn)有類型添加一個(gè)同義字。你可以在任何需要 int 的上下文中使用 inter,即可以用inter來(lái)代替int進(jìn)行整數(shù)變量的定義。

這個(gè)功能是最常用的,而且相對(duì)來(lái)說(shuō)是比較簡(jiǎn)單的。


2.定義新的類型

定義新的類型有多種形式,下面簡(jiǎn)單的列一些。

<pre lang="c" escaped="true">typedef BaseType NewType [arrSize]</pre>

這種類型可以掩飾一些符合類型,其中BaseType是基本類型,NewType是我們所定義的新類型,這個(gè)新定義的NewType可以像其他的基本類型那樣使用。下面舉個(gè)例子:

<pre lang="c" escaped="true">typedef char Array[10]; </pre>

這里的char就是基本的類型,而Array是我們新定義的類型。這里Array是一個(gè)字符型的數(shù)組類型,這個(gè)數(shù)組類型的長(zhǎng)度為10。下面我們就可以用Array來(lái)進(jìn)行一些定義了。

<pre lang="c" escaped="true"> Array array1,array2;</pre>

這里我就定義了兩個(gè)Array型的數(shù)組,這兩個(gè)數(shù)組都是字符型的有10個(gè)元素的數(shù)組;如果我們沒(méi)有用typedef定義,那么我么就要進(jìn)行下面這樣的定義:

<pre lang="c" escaped="true"> char array1[10];char array2[10]。</pre>

這種形式可以應(yīng)用到指針等。

這里引入typedef一個(gè)陷阱:

<pre lang="c" escaped="true">
typedef char * pstr;
  int mystrcmp(pstr, pstr);
</pre>
我們知道,標(biāo)準(zhǔn)函數(shù) strcmp()有兩個(gè)"const char *"類型的參數(shù)。因此,它可能會(huì)誤導(dǎo)人們象下面這樣聲明 mystrcmp():
   <pre lang="c" escaped="true"> int mystrcmp(const pstr, const pstr); </pre>
   用GNU的gcc和g++編譯器,是會(huì)出現(xiàn)警告的,按照順序,"const pstr"被解釋為"char* const"(一個(gè)指向 char 的常量指針),兩者表達(dá)的并非同一意思。應(yīng)該按以下方式定義:
<pre lang="c" escaped="true">
typedef const char* pstr;
</pre>


函數(shù)類型的形式
<pre lang="c" escaped="true">typedef int (*PF) (const char *, const char *)</pre>
這種類似的形式

這個(gè)聲明引入了 PF 類型作為函數(shù)指針的同義字,該函數(shù)有兩個(gè) const char * 類型的參數(shù)以及一個(gè) int 類型的返回值。這種定義的用途過(guò)會(huì)在下面以例子的形式給出。

typedef 就像 auto,extern,mutable,static,和 register 一樣,是一個(gè)存儲(chǔ)類關(guān)鍵字。這并不是說(shuō) typedef 會(huì)真正影響對(duì)象的存儲(chǔ)特性;它只是說(shuō)在語(yǔ)句構(gòu)成上,typedef 聲明看起來(lái)象 static,extern 等類型的變量聲明。這一點(diǎn)對(duì)于我們理解typedef定義新類型的功能很有用。

這里引入typedef另外一個(gè)陷阱:

<pre lang="c" escaped="true"> typedef register int FAST_COUNTER; </pre>

編譯通不過(guò)。問(wèn)題出在你不能在聲明中有多個(gè)存儲(chǔ)類關(guān)鍵字。因?yàn)榉?hào) typedef 已經(jīng)占據(jù)了存儲(chǔ)類關(guān)鍵字的位置,在 typedef 聲明中不能用 register(或任何其它存儲(chǔ)類關(guān)鍵字)。

?

3.typedef與結(jié)構(gòu)體結(jié)合使用

<pre lang="c" escaped="true">
struct var {
int data1;
int data2;
char data3;
};
</pre>

這里定義一個(gè)類型var,而要定義這種類型的變量,必須這樣寫:struct var a;若添加typedef struct var newtype;則定義變量只需這樣即可:newtype a;

typedef和結(jié)構(gòu)體一般不這樣使用,而是按下面這樣子:

<pre lang="c" escaped="true">
typedef struct var {
int data1;
int data2;
char data3;
} newtype;

newtype a;

</pre>

在鏈表中更一般的形式:

<pre lang="c" escaped="true">
  typedef struct tagNode
  {
  char *pItem;
  struct tagNode *pNext; //這里不能寫為*pNode *pNext;
  } *pNode;
</pre>


<pre lang="c" escaped="true">
或者 typedef struct tagNode *pNode;
  struct tagNode
  {
  char *pItem;
  pNode pNext;
  };
</pre>

typedef 有另外一個(gè)重要的用途,那就是定義機(jī)器無(wú)關(guān)的類型,例如,你可以定義一個(gè)叫 REAL 的浮點(diǎn)類型,在目標(biāo)機(jī)器上它可以獲得最高的精度:
  <pre lang="c" escaped="true">typedef long double REAL; </pre>
  在不支持 long double 的機(jī)器上,該 typedef 看起來(lái)會(huì)是下面這樣:
  <pre lang="c" escaped="true">typedef double REAL; </pre>
  并且,在連 double 都不支持的機(jī)器上,該 typedef 看起來(lái)會(huì)是這樣:
  <pre lang="c" escaped="true"> typedef float REAL; </pre>


4.linux內(nèi)核中typedef的例子:

<pre lang="c" escaped="true">typedef int (*PF) (const char *, const char *) </pre>
前面提到的這種類似的形式是可以簡(jiǎn)化函數(shù)的,而且便于理解。舉linux內(nèi)核中信號(hào)處理函數(shù)這個(gè)例子:


<pre lang="c" escaped="true"> void (*signal (int signr,void (*handler)(int))) (int) </pre>

其用typedef定義如下:

<pre lang="c" escaped="true">
typedef void sigfunc(int);

sigfunc *signal(int signr,sigfunc *handler);

</pre>
其中typedef定義了一個(gè)有一個(gè)整型參數(shù)無(wú)返回值的函數(shù)類型。void (*handler)(int)表示一個(gè)有一個(gè)整型參數(shù)無(wú)返回值的函數(shù)指針,這個(gè)指針名為handler,所以其可以用sigfunc進(jìn)行說(shuō)明,此時(shí)sigfunc就相當(dāng)于前面的int signr中int的作用;同理這個(gè)函數(shù)也是這樣。

注:對(duì)復(fù)雜變量建立一個(gè)類型別名的方法很簡(jiǎn)單,你只要在傳統(tǒng)的變量聲明表達(dá)式里用類型名替代變量名,然后把關(guān)鍵字typedef加在該語(yǔ)句的開頭就行了。

<pre lang="c" escaped="true">
  int *(*a[5])(int, char*);
  //pFun是我們建的一個(gè)類型別名
  typedef int *(*pFun)(int, char*);
  //使用定義的新類型來(lái)聲明對(duì)象,等價(jià)于int* (*a[5])(int, char*);
  pFun a[5];

</pre>

轉(zhuǎn)載于:https://www.cnblogs.com/liweilijie/p/4984199.html

總結(jié)

以上是生活随笔為你收集整理的typedef 深入剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。