<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. C語言

    C語言typedef的使用

    時間:2025-05-30 10:22:27 C語言 我要投稿
    • 相關推薦

    C語言typedef的使用

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

      具體方法如下:

      C 語言提供 typedef 關鍵字,允許你為已經存在的類型起一個新的名字,有一點需要注意,typedef 僅僅是為已經存在的類型創建了一個新的名字而已,不是創建新的類型。

      首先將 typedef 關鍵字放在前面,接著是已經存在的類型名,接著是新的名字:

      typedef existing_type new_name;

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

      typedef unsigned int score;

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

      score high_score;

      當然你還可以同時定義多個變量

      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的整型數組 */

      arr xxx; /* 9*6 階的整型數組 */

      c ch; /* 一個字符 */

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

      carr chry; /* 容量為100的字符數組 */

      C 語言 typedef 的使用

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

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

      接下來舉一些typedef 在函數指針、結構體、枚舉等中的應用

      使用 typedef 作用于結構體:

      為了定義一個復雜的數據,定義一個如下的結構體:

      struct complex {

      float real;

      float imag;

      };

      struct complex a, b;

      如果不使用typedef, 你必須在每一個變量聲明的地方使用 struct 關鍵字,然而,如果你使用了 tpedef 定義 complex 類型的數,你只需要使用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 作用于聯合體:

      假如你將用戶名和密碼來登錄,這時定義一個account 結構體,其中包含 account_name 聯合體:

      typedef union {

      char *username;

      char *email;

      } account_name;

      typedef struct {

      account_name name;

      char *password;

      } account;

      account user1, user2;

      使用 typedef 作用于枚舉:

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

      typedef enum { red, green, blue } RGB ;

      RGB color;

      如果你不使用 typedef ,每次定義變量的時候都要加上 enum 關鍵字:

      enum RGB { red, green, blue };

      enum RGB color;

      使用 typedef 作用于函數指針:

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

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

      sorter quicksort, bubblesort;

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

      下面總結一下 typedef 的用途:

      1、與#define的區別

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

      2、減少錯誤

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

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

      下面的符合我們的預期

      typedef char* PCHAR;

      PCHAR pa, pb;

      這種用法很有用,特別是char* pa, pb的定義,初學者往往認為是定義了兩個字符型指針,其實不是,而用typedef char* PCHAR就不會出現這樣的問題,減少了錯誤的發生。

      3、平臺無關性

      用typedef來定義與平臺無關的類型。用 typedef 來定義機器無關的類型,例如,你可以定義一個叫 REAL 的浮點類型,在目標機器上它可以獲得最高的精度:

      typedef long double REAL;

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

      typedef double REAL;

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

      標準庫就廣泛使用了這個技巧,比如size_t。另外,因為typedef是定義了一種類型的新別名,不是簡單的字符串替換,所以它比宏來得穩健。

      4、掩飾復合類型

      typedef 還可以掩飾復合類型,如指針和數組。

      例如,你不用像下面這樣重復定義有 81 個字符元素的數組:

      char line1[81];

      char line2[81];

      定義一個 typedef,每當要用到相同類型和大小的數組時,可以這樣:

      typedef char Line[81];

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

      typedef char * pstr;

      int mystrcmp(pstr, pstr);

      這里將帶我們到達第一個 typedef 陷阱。標準函數 strcmp()有兩個‘ const char *'類型的參數。因此,它可能會誤導人們象下面這樣聲明 mystrcmp():

      int mystrcmp(const pstr, const pstr);

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

      typedef const char* pstr;

      5、代碼簡化

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

      原聲明:

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

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

      typedef void (*pFunParam)();

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

      typedef void (*pFunx)(pFunParam);

      原聲明的最簡化版:

      pFunx b[10];

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

      int (*func)(int *p);

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

      再看一個例子 :

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

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

    【C語言typedef的使用】相關文章:

    C語言for循環的使用10-24

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

    C語言的內存使用09-23

    C語言變量的使用10-12

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

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

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

    C語言EOF如何使用08-29

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

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人