1) 宏替换只作替换,不做计算,不做表达式求解,不做类型检查…
2) 可以用#undef 命令终止宏定义的作用域。
3) 宏定义可以嵌套,最多替换 200+次(具体记不清了)。
1. 防止文件重复包含
#ifndef XXX_H_
#define XXX_H_
…
#endif
2. 编译过程控制
#ifdef _DEBUG
…
#else
…
#endif
3. 定义常量
#define PI 3.14
4. 带参数的宏
#define max(a,b) ((a) > (b) ? (a) : (b))
5. 包含多个语句的宏
#define msg(str) do \
{ \
…;\
…;\
}while(0)
6. #和##的用法
宏替换会把#后面的内容作为字符串进行替换,例子:
#define PASTE(n) "abc"#n
替换之后相当于”abc””n”
比如 PASTE(12) -> “abc12”
##用于把两侧的参数合并成一个符号,例子:
#define composite(a,b,c) a##b##c
则 composite(12,12,11) -> 121211
composite(“aa”,”bb”,”cc”) -> “aabbcc”
注意:当宏参数是另一个宏的时候,会递归展开,但用'#'或'##'的(该)宏参数不会再展开。
a.宏定义中不存在#和##
#define two 2
#define muli(a,b) ((a)*(b))
则 muli(two,two)的参数 two 会被递归展开
结果为 ((2)*(2))
b.宏定义中存在#或##
#define two 2
#define muli_(a,b) a##*##b
则muli(two,two)的参数two不会被展开