## 類型别名 typedef
格式:
typedef 原類型名 新類型名;
- 其中原類型名中含有定義部分,新類型名一般用大寫表示,以便于差別。
- 有時也可用宏定義來代替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差別
與函數的差別
從整個使用過程可以發現,帶參數的宏定義,在源程式中出現的形式與函數很像。但是兩者是有本質差別的:
- 宏定義不涉及存儲空間的配置設定、參數類型比對、參數傳遞、傳回值問題
- 函數調用在程式運作時執行,而宏替換隻在編譯預處理階段進行。是以帶參數的宏比函數具有更高的執行效率
typedef和#define的差別
- 用宏定義表示資料類型和用typedef定義資料說明符的差別。
- 宏定義隻是簡單的字元串替換,是在預處理完成的
- 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;
}