最近在代碼裡發現了一個宏定義
#define ....... a#b
這個A#B是什麼東西?查閱了一下,竟然是字元串連接配接符,除了#外還有一個##,以下是差別。
##是一個連接配接符号,用于把參數連在一起
例如:
> #define FOO(arg) my##arg
則
> FOO(abc)
相當于 myabc
#是“字元串化”的意思。出現在宏定義中的#是把跟在後面的參數轉換成一個字元串
例如:
> #define STRCPY(dst, src) strcpy(dst, #src)
則
> STRCPY(buff, abc)
相當于 strcpy(buff, "abc")
另外,如果##後的參數本身也是一個宏的話,##會阻止這個宏的展開。
“##”是一種分隔連接配接方式,它的作用是先分隔,然後進行強制連接配接。
其中,分隔的作用類似于空格。我們知道在普通的宏定義中,預處理器一般把空格
解釋成分段标志,對于每一段和前面比較,相同的就被替換。但是這樣做的結果是,
被替換段之間存在一些空格。如果我們不希望出現這些空格,就可以通過添加一些
##來替代空格。
另外一些分隔标志是,包括操作符,比如 +, -, *, /, [,], ...,是以盡管下面的
宏定義沒有空格,但是依然表達有意義的定義: define add(a, b) a+b
而其強制連接配接的作用是,去掉和前面的字元串之間的空格,而把兩者連接配接起來。