c++ 宏定义的时候,会用到#和##,
1.#:将宏定义中的符号转换成字符串,例如
宏定义
#define RegisterTest(featue,name) \
std::cout << #featue << ":"<< #name<< std::endl;
调用
RegisterTest(a, b)
结果输出
a:b
2.##:拼接多个宏的符号,例如
宏定义
#define RegisterTest(featue,name) \
int helper##feature##name = 1;
调用
RegisterTest(a, b)
就定义了一个名为helperab的int变量。
3.笔者在宏定义使用中遇到的问题:
a.宏调用传入双引号""问题
#include "iostream"
#define RegisterTest(featue,name) \
if (#featue == "") { \
std::cout << "feature empty" << ":" << #feature << " " << #name<< std::endl; \
} else { \
std::cout << "feature not empty" << ":" << #feature << " " << #name<< std::endl; \
}
int main() {
RegisterTest("",b);
return 0;
}
以上代码执行后,会执行到else语句,输出
feature not empty:""b
因为宏调用时传入"",实际上#feature是双引号本身"",而不是空字符,所以会走到else
如果要走到if里面,应该的调用方式是:
RegisterTest(, b),调用时不写变量,用逗号分开就可以。
b.宏定义中调用if
如下两个代码:
#include "iostream"
#define RegisterTest(featue,name) \
if (#featue == "") { \
std::cout << "empty" << ":" << #name<< std::endl; \
} else { \
std::cout << "not empty" << ":" << #name << std::endl; \
}
int main() {
RegisterTest("",b);
return 0;
}
编译没有问题,但是如果把宏调用RegisterTest("",b);写在main函数外面:
#include "iostream"
#define RegisterTest(featue,name) \
if (#featue == "") { \
std::cout << "empty" << ":" << #name<< std::endl; \
} else { \
std::cout << "not empty" << ":" << #name << std::endl; \
}
RegisterTest("",b);
int main() {
return 0;
}
这样就编译不通过了,因为if和else语句最终要放到一个方法里,而上面的代码宏展开后,没有在方法体内,所以出错了。