「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.预处理器-宏函数


分享到:


相關文章: