C/C++語言中的#和##的作用

作者: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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章