目录
#define 宏定义的使用
宏的本质是简单的文本替换。
如下,表示的是x和y的比较最大值和最小值的宏替换定义:
#define MAX(x,y) (((x)>(y))?(x):(y));
#define MIN(x,y) (((x)<(y))?(x):(y));
用的时候,也很简单,直接进行调用就行了:
#include <iostream>
#include <stdio.h>
#define MAX(x,y) (((x)>(y))?(x):(y));
#define MIN(x,y) (((x)<(y))?(x):(y));
int main()
{
int x = 2, y = 8;
printf("x = %d, y = %d\n", x, y);
int MAX_result = MAX(x, y);
printf("MAX_result:%d\n",MAX_result);
int MIN_result = MAX(x, y);
printf("MIN_result:%d\n", MIN_result);
system("pause");
return 0;
}
运行结果:
宏定义的经验总结
- 宏定义语句后面,不用加逗号。
- 宏中需要把参数给小心地给用括号括起来,因为宏只是简单的文本替换,如果不注意,很容易引起二义性。
- 为什么上面要用三元运算符(?:)呢?这是因为,这个运算符可以起到比if-else更优化的代码,并且书写的也更简洁明了!
- 千万要注意,宏只是文本替换,不是函数表达式,什么意思呢?给你举个例子:
int main()
{
int x = 2, y = 8;
printf("x = %d, y = %d\n", x, y);
//int MAX_result = MAX(x, y);
printf("MAX_result:%d\n", MAX(x, y)); //如果把中间变量MAX_result给去掉,直接把宏放在printf里面,是会报错的!
system("pause");
return 0;
}
还是上面的代码,只是修改了一下位置,就报错了,这是因为宏只是文本替换,如果把"Max(x,y)"放在了printf里面,就会出现错误。而想之前的,如果把一个函数放在里面,就不会出现,因为函数默认的返回一个结果,并让这个结果继续运行,而宏不会。
宏定义的二义性歧义
比如,我下面想用宏定义来实现一个平方操作,如果按照正常的思路编写一个宏SQR1,那么得到的结果就不是我期望想得到的平方结果了!
#include <iostream>
#define SQR1(x) (x*x)
#define SQR2(x) ((x)*(x))
int main()
{
int a = 2, b = 4;
int result1 = SQR1(a+b); // 执行的是2+4*2+4 = 14
printf("SQR1执行平方操作的结果:%d\n", result1);
int result2 = SQR2(a+b); // 执行的是 (2+4)*(2+4) = 36
printf("SQR2执行平方操作的结果:%d\n", result2);
system("pause");
return 0;
}
运行结果:
再次强调,在定义宏的时候,一定要考虑宏的本质只是一个简单的文本替换,并不是函数,所以,该加括号的地方,一定要加,否则会出现二义性的歧义问题。
如何使用宏定义连接参数
那么,既然宏只是简单的文本替换,那么是否可以用宏的表示符号,来连接参数呢?
其实,就是"##"符号的使用
#include <iostream>
#define STR(s) #s
#define CONS(a,b) (int)(a##e##b)
int main()
{
printf("%s",STR(vck)); //这样写可以
printf("\n");
printf(STR(vck)); //这样写也可以
printf("\n");
printf("%d", CONS(1, 2)); //1e2 ->10^2->100(1乘以10的2次方)
printf("\n");
system("pause");
return 0;
}
运行结果:
#ifdef、#else、#endif在程序中的使用
"#ifdef ... #endif"之间的打印消息将不会输出出来。
比如下面的代码逻辑,先定义一个叫DEBUG的宏定义,然后,下面的(#ifdef DEBUG)如果存在一个名为DEBUG的宏定义,就执行#ifdef和#endif之间的语句,如果没有,就跳过。
#include <stdio.h>
#include <stdlib.h>
#define DEBUG
int main()
{
int i = 0;
char c;
while (1)
{
i++;
c = getchar();
if (c != '\n')
{
getchar();
}
if (c == 'q' || c == 'Q')
{
#ifdef DEBUG
printf("we got:%c, about to exit.\n", c);
#endif
break;
}
else
{
printf("i = %d", i);
#ifdef DEBUG
printf(", we got:%c", c);
#endif // DEBUG
printf("\n");
}
}
system("pause");
return 0;
}