作者:DanDan_M
原文:https://blog.csdn.net/michaelhit/article/details/82853634
經常遇到C/C++宏定義中的#,#的用法分爲兩種:#和##
1)#表示將宏定義中的參數變成字符串
2)##表示將宏定義中的參數變成字符串連在一起
例1:
#include <iostream>
#define STR(a) #a
#define FUNC(a, b) a##b
using namespace std;
int main()
{
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
using namespace std;
int main()
{
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)
using namespace std;
int main()
{
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