「C與指針心得」25.預處理器-宏函數

上一節講了一些系統的預定義宏,這一節來講一講 宏定義、宏函數。

預處理常量 define:

預處理器指令從#開始,到最後第一個換行符為止。如果在結尾出現反斜槓,則定義會自動延續到下一行。

/*define定義一個常量MAX_VALUE*/
#define MAX_VALUE 10
/*define結尾出現反斜槓,定義自動延續到下一行*/
#define PARAGRAPH “This is the first example\
of define "
printf(“max value is %d\n”,MAX_VALUE);
printf(“paragraph is %s\n”,PARAGRAPH);

每個define行有三部分組成。

  • 第一部分為#define本身;
  • 第二部分為所選擇的縮略語,成為宏,宏的名字中不允許有空格,我們約定使用大寫表示。
  • *第三部分為宏替換的文本,成為宏展開。如果沒有替換文本,我們成為一個基本宏定義。


宏判斷:

如果我們想一些段落代碼,只在部分宏有定義的情況下才只用,我們這裡會用到宏判斷。

格式:

#ifdef XXX
...
#else
...
#endif

例:

#define PROJECT_TEST
int main(void)
{
#ifdef PROJECT_TEST
printf(“marco PROJECT_TEST is defined\n”);
#else
printf(“marco PROJECT_TEST not defined\n”);
#endif
return 0;
}

如果我們在工程中定義了PROJECT_TEST這個宏,則打印第一段,否則打印第二段。

宏函數:

宏函數,即用宏的方式來實現函數。
宏函數末尾不能帶分號做結尾。
宏函數中的參數都需要用括號擴起來。

例如:

#define SEQUERE(a) a*a
int seq_value;
int a = 4;
seq_value = SEQUERE(a);
printf(“seq_value = %d\n”,seq_value);

輸出:16

但是這種寫法有個問題,如果我們傳入的a為 a+1時,就會發生問題

int seq_value;
int a = 4;
seq_value = SEQUERE(a+1);
printf(“seq_value = %d\n”,seq_value);


輸出: 9
輸出的內容為9,而不是我們期望的25.
我們簡化一下這個程序
SEQUERE(a) aa
變為a+1a+1
a為4,所以結果為4+1*4+1 = 9.

為了避免這種情況,我們在宏函數中的每個參數都需要用小括號()括起來。

即為#define SEQUERE(a) (a)*(a)

「C與指針心得」25.預處理器-宏函數


分享到:


相關文章: