在代码中的宏定义里,无意看到了##的使用,查资料发现这种预处理运算符。
## 表示连接
#include <iostream>
using namespace std;
#define Connect(x,y) x##y
void func1()
{
cout<<"func1"<<endl;
}
int num1=1;
int main() {
Connect(func,1)();
cout<<Connect(num,1)<<endl;
return 0;
}
输出:
func1
1
注:
(1)##前后的空格可有可无,不会影响实际拼接的效果
(2)连接后的实际参数名需要有意义,需要已经被定义
(3)如果##后的参数本身也是一个宏的话,则会被阻止展开
多层宏定义展开的规则:
一般而言,从内层到外层依次展开宏;
但是,如果外层宏展开后有#或##运算符,则不对其内层的宏做展开。这种情况下,应该将代有#或##操作的宏放入最内层,要么在这样的宏外面再包裹一层,并且调用包裹后的宏。----宏展开感觉也可以继续再研究一下。
# 表示字符串化(将传入的参数名转化成字符串,加双引号)
#define example(instr) #instr
string str=example(abc);//将会展开成 string str="abc";
注:
(1)参数前后的空格不对转换产生影响
(2)参数内部的空格,则会存在于转换后的字符串中
#include <iostream>
using namespace std;
#define example1(a) #a
int main() {
string x=example1( 10 01);
cout<<x<<endl;
return 0;
}
输出:
10 01
#@ 表示字符化(将传入的单字符参数名转化成字符,加单引号)
#define example2(x) #@x
char a=example2(b);//将会展开成 char a='b';
注:
(1)使相应的参数括在单引号中,并被视为一个字符( Microsoft 特定 ),GCC/G++无此运算符。
(2)参数需要时一个字符,多了会出现错误或编译失败。
很好的参考文章:
深入理解#define预处理,预处理器运算符# ## #@