#define 的"##","@","#"妙用

常見下面的一些#define的用法,很有意思啊。(網上看到,整理留存)

#define Conn(x,y)   x##y
#define ToChar(x)   #@x
#define ToString(x) #x


①"x##y"表示什麼?

表示x連接y,舉例說:

int  n = Conn(123,456);  //結果就是n=123456;
char* str = Conn("asdf", "adf"); //結果就是 str = "asdfadf";


②"#@x"

其實就是給x加上單引號,結果返回是一個const char。舉例說:

char a = ToChar(1); //結果就是a='1';

做個越界試驗:

char a = ToChar(123); //結果是a='3';
但是如果你的參數超過四個字符,編譯器就給給你報錯了!error C2015: too many characters in constant   :P

③"#x"

是給x加雙引號

char* str = ToString(123132); //結果就是str="123132";


④宏替換的處理機制

請看下面的宏定義

#define f(a,b) a##b 
#define d(a)   #a 
#define s(a)   d(a) 

此時,宏替換分爲兩種情況(實質上就是嵌套宏優先級別的控制):
1.不以"#"開頭的,先展開其參數宏,然後是再替換代碼:

puts(s(f(a,b)));  //-->puts(s(ab))-->puts(d(ab))-->puts("ab") 

2.以"#"開頭的,直接替換,不展開:

puts(d(f(a,b)));  //-->puts("f(a,b)") 

要善用,但千萬別把自己繞暈了!疑問


整理後,又發現網上還有很好的參考資料,請挪步查閱:

1、C/C++宏的使用總結

2、C++中的宏替換




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