#define函数
#define DEBUG(x) ((x)+(x))
如上所示,用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作等或邻近操作符之间不可预料的相互作用。
#define替换
1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,它们首先被替换。
2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被它们的值替换。
替换文本指的是#define DEBUG(x) ((x)+(x))中的 ((x)+(x))
3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号,如果是,就重复上述的处理过程。
宏参数和#define定义可以包含其他#define定义的符号,但是,宏不可以出现递归,也就是不可以自己调用自己。
若想要在宏里面写一个大面积的代码,最好用do{...}while(0)把代码括起来,这样写会带来很多方便,比如最后人们写代码习惯加分号,还有可以使在运行时不会出现逻辑上的错误。
#include<stdio.h>
#include<windows.h>
#define FUN1 do{printf("xixi\n");\
printf("haha\n");\
printf("heihei\n");\
printf("hehe\n");\
}while(0)
int main()
{
if (0)
FUN1;
else
FUN1;
system("pause");
return 0;
}
像这样就可以,若不用do{...}while(0),if else就无法正常使用。
#的用法
我们知道printf()函数具有邻近字符串的连接性。
给一个宏的参数前面加上一个#,会把参数转换成参数代表的字面值。
#include<stdio.h>
#include<windows.h>
#define M 9
#define PRINT(FORMAT, VALUE) \
printf("the value of "#VALUE" is "FORMAT"\n",VALUE)
int main()
{
PRINT("%d", M);
system("pause");
return 0;
}
## 的用法
##结构则执行一种不同的任务,他可以把它两边的宏符号连接成一个宏符号。作为作用之一,它允许宏定义从分离的文本段创建表示符。
说白了,可以把两个名称通过##连接在一起,构成一个新的宏名称。
#include<stdio.h>
#include<windows.h>
#define STR1 "vrey"
#define STR2 "good"
#define STR1STR2 "12345678"
#define CAT(a,b)\
a##b
int main()
{
printf("%s\n",CAT(STR1, STR2));
system("pause");
return 0;
}
还应该注意宏的命名:宏命名全部都是大写
#undef
这个预处理指令用于移除一个指定的宏定义
格式:#undef NAME