常見下面的一些#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)")
要善用,但千萬別把自己繞暈了!
整理後,又發現網上還有很好的參考資料,請挪步查閱:
2、C++中的宏替換