C中的预处理宏
宏定义就属于预处理命令的一种。那么,什么是宏呢?
宏:c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。
宏替换:宏替换就是宏定义。在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。
宏分为两种:
1、无参数宏 #define 标识符 字符串
2、带参数宏 #define 标识符(形参表) 字符串
因为无参数宏比较简单,所以重点说一下带参数宏。
有参宏定义中#的用法
#define STR(str) #str
#用于把宏定义中的参数两端加上字符串的""
比如,这里STR(my#name)会被替换成"my#name"
一般由任意字符都可以做形参,但以下情况会出错:
STR())这样,编译器不会把“)”当成STR()的参数。
STR(,)同上,编译器不会把“,”当成STR的参数。
STR(A,B)如果实参过多,则编译器会把多余的参数舍去。
STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。
一个预处理宏的例子:
# define PRINT(STR,VAR) cout<
跟在宏名后面的括号中的参数会被闭括号后面的所有代码替代。只要在调用宏的地方,预处理程序就删除名字PRINT并替换代码,所以使用宏名时编译器不会报告任何错误信息,它并不对参数做任何类型检查。
有参宏定义中##的用法
#define WIDE(str) L##str
则会将形参str的前面加上L
比如:WIDE("abc")就会被替换成L"abc"
如果有#define FUN(a,b) vo##a##b()
那么FUN(id ma,in)会被替换成void main()
另一个例子:
# define P(EX) cout<
其中的“#”被称为:字符串化的预处理特征,其作用是获得任何一个表达式并把它转换为一个字符数组。
多行宏定义:
#define doit(m,n) for(int i=0;i
{\
m+=i;\
}