C語言中宏定義都有那些盲區?

大雄45發表於2022-10-12
導讀 #define 是C語言中的一個宏定義 ,它用來將一個識別符號定義為一個字串,該識別符號被稱為宏名,被定義的字串稱為替換文字。
C語言中宏定義都有那些盲區?C語言中宏定義都有那些盲區?

Road in Himalayas. Spiti Valley, Himachal Pradesh, India

1、概念

命令有兩種格式:一種是簡單的宏定義,另一種是帶引數的宏定義。

(1)簡單的宏定義:

#define <宏名> <字串>

#define VALUE  ((sizeof(a)) /sizeof(a[0]))

(2) 帶引數的宏定義 #define <宏名> (<參數列>) <宏體>

#define MAX(a,b) ((a)>(b)?(a):(b))
2、不能忽略宏定義中的空格

下面的宏定義中f是否帶了引數呢?

#define f (x) ((x)+1)

答案是否定的,在f與(x)之間存在一個空格,導致變成了如下定義。

#define  f   (x)((x)+1)

C語言中宏定義都有那些盲區?C語言中宏定義都有那些盲區?
預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程式時發現。

3、宏不是函式

如果我們定義一個宏:

#define  MAX(a,b)  a>b?a:b

當我們執行一個語句:

3+MAX(1,3);

我們期望的答案應該是6才對,其實呢,執行之後的答案1。與宏定義相掛鉤的就是優先順序,算數運算子的優先順序高於條件運算子,展開如下。

3+1>3?1:3,首先進行算符運算子的運算,即4>3?1:3,所以答案為1。

請注意宏定義中的括號,這些括號的作用就是預防引起優先順序相關的問題。有些專家建議在C語言中只要牢記兩個優先順序就夠了,乘除法優先順序高於加減法,在設計其它運算子時,一律加上括號。

4、宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換
5、宏不是型別定義

C語言中宏定義都有那些盲區?C語言中宏定義都有那些盲區?
首先定義一個宏

#define pChar char*

再用pChar 定義兩個變數,之後用運算子sizeof讀取變數所佔用記憶體大小,如果是指標型別的就佔4個位元組,如果是字元型的就佔1個位元組。

C語言中宏定義都有那些盲區?C語言中宏定義都有那些盲區?

結果佔用空間不一樣,變數型別自然不一樣,所以宏定義不是型別定義。那如果我換成typedef來定義型別呢?

C語言中宏定義都有那些盲區?C語言中宏定義都有那些盲區?

宏定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明。

6、與之相關的宏定義

編寫程式過程中,很多都需要條件編譯,來看一個常用的使用方法。

#if defined(CREDIT)
   credit();
#elif defined(DEBIT)
   debit();
#else
   printerror();
#endif
7、總結

宏的本質是程式碼替換。

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2914594/,如需轉載,請註明出處,否則將追究法律責任。

相關文章