经常遇到C/C++宏定义中的#,#的用法分为两种:#和##
#表示将宏定义中的参数变成字符串
##表示将宏定义中的参数变成字符串连在一起
例子:
#include <iostream>
#define STR(a) #a
#define FUNC(a, b) a##b
int main()
{
using namespace std;
int a = 1, b = 2;
string ab("Hello");
cout << STR(a) << endl;
cout << FUNC(a, b) << endl;
return 0;
}
输出:
a
Hello
解释:
#a 将a转为了字符串,所以输出的不是1,而是a
a##b将输入的参数a b连接为字符串ab,而变量ab为字符串类型,值为Hello,所以输出的是Hello
需要注意的是有#或者##的地方,不会将参数展开了
例如:
#include <iostream>
#define PI 3.14
#define STR(a) #a
#define F(t,f) t##f
int main()
{
using namespace std;
int P = 5, I = 6;
cout << STR(PI) << endl;
cout << F(5, 6) << endl;
cout << F(P, I) << endl;
return 0;
}
输出:
PI
56
3.14
解释:
没有将PI解释,直接将PI转为字符串了
56输出正常与下面的输出对比,P和I没有转义,而是直接输出PI,因为PI为3.14,所以输出的是3.14
解决方法:加一层中间转换层
#include <iostream>
#define PI 3.14
#define _STR(a) #a
#define STR(a) _STR(a)
#define _F(t,f) t##f
#define F(t,f) _F(t,f)
int main()
{
using namespace std;
int P = 5, I = 6;
cout << STR(PI) << endl;
cout << F(5, 6) << endl;
cout << F(P, I) << endl;
return 0;
}
输出:
3.14
56
3.14