上一節講了一些系統的預定義宏,這一節來講一講 宏定義、宏函數。
預處理常量 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)
閱讀更多 大貓玩程序 的文章