宏名字不能重载,而且宏处理器不能处理地柜调用:
#define PRINT(a, b) cout<<(a)<<(b) #define PRINT(a,b,c) cout<<(a)<<(b)<<(c) /*重复定义,不允许重载*/ #define FAC(n) (n>1)? n*FAC(n-1): 1 /*递归的宏*/ |
通过##宏运算符可以拼接起两个串,构造出一个新串.例如,
#define NAME2(a, b) a##b int NAME2(hack, cah)(); 将产生 int hackcah(); 提供给编译器去读. |
指令
#undef X
保证在该指令之后,不再有称为X的宏-无论在此指令之前有还是没有.例如,
#define PRINT(a, b) cout<<(a)<<(b) int main() { PRINT(1,2); // 正确 #undef PRINT PRINT(3,2); // 错误,不含有PRINT宏定义 } |
通过#宏运算符可以其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号,例如,
#define PARAM(a) #a int main() { int a; std::cout << PARAM(a) << std::endl; // 输出: a } |