C語言巨集定義中#、##、#@符號的使用
1、巨集定義中#的使用
在C語言的巨集中,#的功能是將其後面的巨集引數進行字串化操作(Stringfication),簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上一個雙引號。
例:
#define A(x) #x
#define B(x, y) #x"."#y
即 A(123) ------> "123"
B(123, 456) ------> "123"".""456"
std::string str1 = A(test); //即str1 = “test”;
std::string str2 = B(abc, 123); //即str2 = "abc"".""456" ---> 等價於 str2 = "abc.123";
2、巨集定義中##連線符的使用
##連線符號其功能是在帶引數的巨集定義中將兩個子串(token)聯接起來,從而形成一個新的子串,即##將其緊鄰的前後兩個子串聯接起來。所以##的前後各必須存在一個子串,即n個##連線符連線n+1個子串。
#define A(x) test_##x //test_是第一個子串,x是第二個子串,##則將兩個子串連線到一起
#define B(x, y) x##y //x是第一個子串,y是第二個子串
#define C(x, y) test_##x##_##y //test_是第一個子串,x是第二個子串,_是第三個子串,y是第四個子串
#define D(x, y, z) x##y##z
即:
A(1) ---> test_1
B(abc, 123) ---> abc123
C(abc, 123) ---> test_abc_123
D(test, 1, 23) ---> test123
3、巨集定義中#@符號使用
在C語言的巨集中,#@的功能是將其後面的巨集引數字元化,即在其左右各加上一個單引號。
#define A(a) #@a
即:
A(!) ---> '!'