一、 宏的使用
1.1 宏的展开替换
#include <stdio.h>
#define PING_FANG(x) x * x
int main()
{
//输入两个数a, b,求(a+b)的平方
int a, b;
scanf_s("%d%d", &a, &b);
printf("%d\n", PING_FANG(a + b));
return 0;
}
运行结果:
PS:
1. 如果我们输入1和2,预期的结果应该是9,但是为什么会是5呢,原因在于宏展开的时,把PING_FANG(1 + 2)展开成1 + 2 * 1 + 2,由于运算符优先级,先算乘法,所以结果为5
2. 如果要得到预期结果有两种改法,一种是把第三行中的x * x改成(x)* (x),第二种改法是把第十行的PING_FANG(a + b)改成PING_FANG((a + b))
1.2 带参数的宏函数的展开顺序
#include <stdio.h>
#define F1(x,y) x##y
#define F2(x) #x
#define F3(x) F2(x)
int main()
{
printf("%s\n", F3(F1(8, 9)));
printf("%s\n", F2(F1(8, 9)));
return 0;
}
运行结果:
PS:
1. 在宏定义中,#是把参数字符串化,##是连接两个参数成为一个整体
2. 从外往内替换宏函数,如果遇到#或者##,则停止替换
3. F3(F1(8, 9))-》F3(89)-》F2(89)-》89
4. F2(F1(8, 9))-》F1(8,9)(因为遇到#停止替换,直接转为字符串)