天天看點

C語言類型别名typedef與宏定義#define

## 類型别名 typedef

格式:  

typedef 原類型名 新類型名;

  1. 其中原類型名中含有定義部分,新類型名一般用大寫表示,以便于差別。
  2. 有時也可用宏定義來代替typedef的功能,但是宏定義是由預處理完成的,而typedef則是在編譯 時完成的,後者更為靈活友善。
//基本資料類型
typedef int INTEGER
INTEGER a; // 等價于 int a;

//也可以在别名的基礎上再起一個别名
typedef int Integer;
typedef Integer MyInteger;



           

用typedef定義數組、指針、結構等類型将帶來很大的友善,不僅使程式書寫簡單而且使意義更為 明确,因而增強了可讀性。

//數組類型
typedef char NAME[20]; // 表示NAME是字元數組類型,數組長度為20。然後可用NAME 說明變量,
NAME a; // 等價于 char a[20];

//結構體類型

 struct Person{
    int age;
    char *name;
};
typedef struct Person PersonType;

或:
typedef struct Person{
    int age;
    char *name;
} PersonType;

或:
typedef struct {
    int age;
    char *name;
} PersonType;

//指針類型,typedef與指向結構體的指針

//定義一個結構體并起别名
  typedef struct {
      float x;
      float y;
  } Point;

 // 起别名
 typedef Point *PP;


//枚舉類型
enum Sex{
    SexMan,
    SexWoman,
    SexOther
};
typedef enum Sex SexType;

或:
typedef enum Sex{
    SexMan,
    SexWoman,
    SexOther
} SexType;

或:
typedef enum{
    SexMan,
    SexWoman,
    SexOther
} SexType;

           

宏定義#define與函數以及typedef差別

與函數的差別

從整個使用過程可以發現,帶參數的宏定義,在源程式中出現的形式與函數很像。但是兩者是有本質差別的:

  1. 宏定義不涉及存儲空間的配置設定、參數類型比對、參數傳遞、傳回值問題
  2. 函數調用在程式運作時執行,而宏替換隻在編譯預處理階段進行。是以帶參數的宏比函數具有更高的執行效率

typedef和#define的差別

  1. 用宏定義表示資料類型和用typedef定義資料說明符的差別。
  2. 宏定義隻是簡單的字元串替換,是在預處理完成的
  3. typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的辨別符具有類型定義說明的功能
typedef char *String1; // 給char *起了個别名String1
#define String2 char * // 定義了宏String2
int main(int argc, const char * argv[]) {
        /*
        隻有str1、str2、str3才是指向char類型的指針變量
        由于String1就是char *,是以上面的兩行代碼等于:
        char *str1;
        char *str2;
        */
      String1 str1, str2;
        /*
        宏定義隻是簡單替換, 是以相當于
        char *str3, str4;
        *号隻對最近的一個有效, 是以相當于
        char *str3;
        char str4;
        */
      String2 str3, str4;
      return 0;
}
           

繼續閱讀