欧美日韩不卡一区二区三区,www.蜜臀.com,高清国产一区二区三区四区五区,欧美日韩三级视频,欧美性综合,精品国产91久久久久久,99a精品视频在线观看

C語言

C語言typedef的使用

時(shí)間:2025-05-30 10:22:27 C語言 我要投稿
  • 相關(guān)推薦

C語言typedef的使用

  typedef 關(guān)鍵字能幫助你簡化復(fù)雜的定義并讓你的代碼簡潔可靠,當(dāng)然,可靠這一點(diǎn)我還是持保留態(tài)度,因人而異吧。具體是如何使用呢?以下僅供參考!

  具體方法如下:

  C 語言提供 typedef 關(guān)鍵字,允許你為已經(jīng)存在的類型起一個(gè)新的名字,有一點(diǎn)需要注意,typedef 僅僅是為已經(jīng)存在的類型創(chuàng)建了一個(gè)新的名字而已,不是創(chuàng)建新的類型。

  首先將 typedef 關(guān)鍵字放在前面,接著是已經(jīng)存在的類型名,接著是新的名字:

  typedef existing_type new_name;

  舉個(gè)例子,如果你想為 unsinged integer 創(chuàng)建一個(gè)新的名叫 score 的類型,你僅需要使用這樣使用 typedef :

  typedef unsigned int score;

  后面你就可以使用“新類型” score 來聲明變量,例如:

  score high_score;

  當(dāng)然你還可以同時(shí)定義多個(gè)變量

  typedef int aaa, bbb, ccc;

  typedef int ar[15], arr[9][6];

  typedef char c, *cp, carr[100];

  /* 下面定義一些對象 */

  /* 都是int */

  aaa int1;

  bbb int2;

  ccc int3;

  ar yyy; /* 容量為15的整型數(shù)組 */

  arr xxx; /* 9*6 階的整型數(shù)組 */

  c ch; /* 一個(gè)字符 */

  cp pnt; /* 指向字符的指針 */

  carr chry; /* 容量為100的字符數(shù)組 */

  C 語言 typedef 的使用

  這里來看一下使用typedef的好處,假如有一天你想將 unsigned int 修改成更大的數(shù)據(jù)類型,比如unsigned long,而此時(shí)你的很多代碼文件都使用了 unsigned int,如果沒有使用typedef,你得到處都修改一遍,十分麻煩。如果使用了之前的定義,這時(shí)只需修改score一處就行,是不是很方便?

  另一個(gè)使用 typedef 來增強(qiáng)可靠性的例子是 size_t,size_t 是 sizeof 操作符指定類型的大小,其基于目標(biāo)處理器的運(yùn)算能力而不是內(nèi)存能力。只要你的程序包含stddef.h庫,你將獲得平臺上的任何對象的準(zhǔn)確大小。

  接下來舉一些typedef 在函數(shù)指針、結(jié)構(gòu)體、枚舉等中的應(yīng)用

  使用 typedef 作用于結(jié)構(gòu)體:

  為了定義一個(gè)復(fù)雜的數(shù)據(jù),定義一個(gè)如下的結(jié)構(gòu)體:

  struct complex {

  float real;

  float imag;

  };

  struct complex a, b;

  如果不使用typedef, 你必須在每一個(gè)變量聲明的地方使用 struct 關(guān)鍵字,然而,如果你使用了 tpedef 定義 complex 類型的數(shù),你只需要使用complex number, you can omit the struct keyword whenever you declare a new variable. 因此使用typedef可以幫助你簡化變量的定義。

  typedef struct {

  float real;

  float imag;

  } complex;

  complex a, b;

  使用 typedef 作用于聯(lián)合體:

  假如你將用戶名和密碼來登錄,這時(shí)定義一個(gè)account 結(jié)構(gòu)體,其中包含 account_name 聯(lián)合體:

  typedef union {

  char *username;

  char *email;

  } account_name;

  typedef struct {

  account_name name;

  char *password;

  } account;

  account user1, user2;

  使用 typedef 作用于枚舉:

  下面的例子描述了怎樣使用 typedef 定義一個(gè)枚舉:

  typedef enum { red, green, blue } RGB ;

  RGB color;

  如果你不使用 typedef ,每次定義變量的時(shí)候都要加上 enum 關(guān)鍵字:

  enum RGB { red, green, blue };

  enum RGB color;

  使用 typedef 作用于函數(shù)指針:

  一個(gè)函數(shù)指針是指向一個(gè)函數(shù)的指針,你可以使用 typedef 來給一個(gè)函數(shù)指針取一個(gè)簡單的名字,看下面的例子:

  typedef int (*sorter)(void* a, size_t size);

  sorter quicksort, bubblesort;

  上面定義了一個(gè)名為sorter的函數(shù)指針來作為一個(gè)新的類型名稱,接著使用它來定義名為quicksort和bubblesort的函數(shù)指針。

  下面總結(jié)一下 typedef 的用途:

  1、與#define的區(qū)別

  typedef 行為有點(diǎn)像 #define 宏,用其實(shí)際類型替代同義字。不同點(diǎn)是 typedef 在編譯時(shí)被解釋,因此讓編譯器來應(yīng)付超越預(yù)處理器能力的文本替換。

  2、減少錯(cuò)誤

  定義一種類型的別名,而不只是簡單的宏替換。可以用作同時(shí)聲明指針型的多個(gè)對象。比如:

  char* pa, pb; // 它只聲明了一個(gè)指向字符變量的指針,和一個(gè)字符變量;

  下面的符合我們的預(yù)期

  typedef char* PCHAR;

  PCHAR pa, pb;

  這種用法很有用,特別是char* pa, pb的定義,初學(xué)者往往認(rèn)為是定義了兩個(gè)字符型指針,其實(shí)不是,而用typedef char* PCHAR就不會(huì)出現(xiàn)這樣的問題,減少了錯(cuò)誤的發(fā)生。

  3、平臺無關(guān)性

  用typedef來定義與平臺無關(guān)的類型。用 typedef 來定義機(jī)器無關(guān)的類型,例如,你可以定義一個(gè)叫 REAL 的浮點(diǎn)類型,在目標(biāo)機(jī)器上它可以獲得最高的精度:

  typedef long double REAL;

  在不支持 long double 的機(jī)器上,該 typedef 看起來會(huì)是下面這樣:

  typedef double REAL;

  也就是說,當(dāng)跨平臺時(shí),只要改下 typedef 本身就行,不用對其他源碼做任何修改。

  標(biāo)準(zhǔn)庫就廣泛使用了這個(gè)技巧,比如size_t。另外,因?yàn)閠ypedef是定義了一種類型的新別名,不是簡單的字符串替換,所以它比宏來得穩(wěn)健。

  4、掩飾復(fù)合類型

  typedef 還可以掩飾復(fù)合類型,如指針和數(shù)組。

  例如,你不用像下面這樣重復(fù)定義有 81 個(gè)字符元素的數(shù)組:

  char line1[81];

  char line2[81];

  定義一個(gè) typedef,每當(dāng)要用到相同類型和大小的數(shù)組時(shí),可以這樣:

  typedef char Line[81];

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

  typedef char * pstr;

  int mystrcmp(pstr, pstr);

  這里將帶我們到達(dá)第一個(gè) typedef 陷阱。標(biāo)準(zhǔn)函數(shù) strcmp()有兩個(gè)‘ const char *'類型的參數(shù)。因此,它可能會(huì)誤導(dǎo)人們象下面這樣聲明 mystrcmp():

  int mystrcmp(const pstr, const pstr);

  用GNU的gcc和g++編譯器,是會(huì)出現(xiàn)警告的,按照順序,‘const pstr'被解釋為‘char* const‘(一個(gè)指向 char 的指針常量),兩者表達(dá)的并非同一意思。為了得到正確的類型,應(yīng)當(dāng)如下聲明:

  typedef const char* pstr;

  5、代碼簡化

  代碼簡化。為復(fù)雜的聲明定義一個(gè)新的簡單的別名。方法是:在原來的聲明里逐步用別名替換一部分復(fù)雜聲明,如此循環(huán),把帶變量名的部分留到最后替換,得到的就是原聲明的最簡化版。舉例:

  原聲明:

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

  變量名為b,先替換右邊部分括號里的,pFunParam為別名

  typedef void (*pFunParam)();

  再替換左邊的變量b,pFunx為別名二:

  typedef void (*pFunx)(pFunParam);

  原聲明的最簡化版:

  pFunx b[10];

  理解復(fù)雜聲明可用的“右左法則”:從變量名看起,先往右,再往左,碰到一個(gè)圓括號就調(diào)轉(zhuǎn)閱讀的方向;括號內(nèi)分析完就跳出括號,還是按先右后左的順序,如此循環(huán),直到整個(gè)聲明分析完。舉例:

  int (*func)(int *p);

  首先找到變量名func,外面有一對圓括號,而且左邊是一個(gè)*號,這說明func是一個(gè)指針;然后跳出這個(gè)圓括號,先看右邊,又遇到圓括號,這說明(*func)是一個(gè)函數(shù),所以func是一個(gè)指向這類函數(shù)的指針,即函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值類型是int。

  再看一個(gè)例子 :

  int (*func[5])(int *);

  func右邊是一個(gè)[]運(yùn)算符,說明func是具有5個(gè)元素的數(shù)組;func的左邊有一個(gè)*,說明func的元素是指針(注意這里的*不是修飾func,而是修飾func[5]的,原因是[]運(yùn)算符優(yōu)先級比*高,func先跟[]結(jié)合)。跳出這個(gè)括號,看右邊,又遇到圓括號,說明func數(shù)組的元素是函數(shù)類型的指針,它指向的函數(shù)具有int*類型的形參,返回值類型為int。

【C語言typedef的使用】相關(guān)文章:

C語言for循環(huán)的使用10-24

C語言的使用的詳解09-17

C語言的內(nèi)存使用09-23

C語言變量的使用10-12

C語言if語句的使用06-30

C語言使用條件語句08-26

C語言變量的定義與使用09-05

C語言EOF如何使用08-29

C語言if語句的使用講解09-18