感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章
上一节讲了一些系统的预定义宏,这一节来讲一讲 宏定义、宏函数。
预处理常量 define:
预处理器指令从#开始,到最后第一个换行符为止。如果在结尾出现反斜杠,则定义会自动延续到下一行。
/*define定义一个常量MAX_VALUE*/#define MAX_VALUE 10/*define结尾出现反斜杠,定义自动延续到下一行*/#define PARAGRAPH “This is the first exampleof define "printf(“max value is %d”,MAX_VALUE);printf(“paragraph is %s”,PARAGRAPH);
每个define行有三部分组成。
- 第一部分为#define本身;
- 第二部分为所选择的缩略语,成为宏,宏的名字中不允许有空格,我们约定使用大写表示。
- *第三部分为宏替换的文本,成为宏展开。如果没有替换文本,我们成为一个基本宏定义。
宏判断:
如果我们想一些段落代码,只在部分宏有定义的情况下才只用,我们这里会用到宏判断。
格式:
#ifdef XXX...#else...#endif
例:
#define PROJECT_TESTint main(void){ #ifdef PROJECT_TEST printf(“marco PROJECT_TEST is defined”); #else printf(“marco PROJECT_TEST not defined”); #endif return 0;}
如果我们在工程中定义了PROJECT_TEST这个宏,则打印第一段,否则打印第二段。
宏函数:
宏函数,即用宏的方式来实现函数。宏函数末尾不能带分号做结尾。宏函数中的参数都需要用括号扩起来。
例如:
#define SEQUERE(a) a*aint seq_value;int a = 4;seq_value = SEQUERE(a);printf(“seq_value = %d”,seq_value);
输出:16
但是这种写法有个问题,如果我们传入的a为 a+1时,就会发生问题。
int seq_value;int a = 4;seq_value = SEQUERE(a+1);printf(“seq_value = %d”,seq_value);
输出: 9输出的内容为9,而不是我们期望的25.我们简化一下这个程序SEQUERE(a) aa变为a+1a+1a为4,所以结果为4+1*4+1 = 9.
为了避免这种情况,我们在宏函数中的每个参数都需要用小括号()括起来。
即为#define SEQUERE(a) (a)*(a)