天天看點

#字元串連接配接符

最近在代碼裡發現了一個宏定義

#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

而其強制連接配接的作用是,去掉和前面的字元串之間的空格,而把兩者連接配接起來。

繼續閱讀