#define巨集與列舉以及typedef關鍵字的區別

草夏農發表於2020-09-23

#define巨集和列舉

  1. #define巨集常量是在預編譯階段進行簡單替換,列舉常量則是在編譯的時候確定其值。
  2. 一般在偵錯程式裡面,可以除錯列舉常量,但是不能除錯巨集常量
  3. 列舉可以一次定義大量相關的常量,但是#define巨集一次只能定義一個

#define巨集和typedef關鍵字

typedef的含義是給一個已知的資料型別取一個別名,實際上變數型別沒有發生變化。

	typedef struct student{
		// some data
	}stu_st, *stu_pst;
	
	struct student stu1;
	stu_st stu2;
	struct student *stu3;
	stu_st* stu4;
	stu_pst stu5;

以上程式碼中,stu1和stu2的含義沒有區別,stu3,stu4,stu5的含義沒有區別。

變數宣告對unsigned的擴充套件支援

以巨集的方式定義資料型別

	#define INT32 int
	typedef int int32

以上兩種方式編譯器都支援,可以理解為將int資料型別取一個int32的別名,但是#define巨集是在預編譯的時候進行簡單替換,但是typedef型別是以一個真正資料型別存在。

	unsigned INT32 index_define = 0; // #define巨集定義的大寫INT32
	unsigned int32 index_typedef = 0; // typedef定義的小寫int32

如上對變數的宣告,編譯器在編譯變數index_typedef 時會報錯,而變數index_define 則可以順利編譯通過,這是因為#define巨集是進行的一次簡單替換,替換後的結果符合編譯器編譯規則,而typedef命名出的資料型別不支援這種unsigned的擴充套件。

指標變數宣告的區別

	#define PINT int*
	typedef int* pint

	PINT p1,P2;
	pint p3,p4;

以上程式碼宣告的變數,其中p1,p3,p4表示int型別的指標變數,p2表示int型別資料。

相關文章