「#」是將巨集字串化(stringification)
「##」是將##左右兩邊的標籤拼接在一起(## is called token concatenation, used to concatenate two tokens in a macro invocation)
看一段**
#include#include #define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
結果輸出:
在巨集預掃瞄((macro prescan)階段,巨集引數首先會被替換,替換之後,再經過下次的掃瞄完成最後巨集的展開(macro expand)。gcc在巨集預處理階段,特意加上了一條排外規則,那就是若巨集引數被用於字串化或者與其它標籤連線
巨集定義中 與 的用法
巨集定義中 的功能是將其後面的巨集引數進行字串化操作 stringfication 舉個例子就明白了 define warn if exp do while 0 使用warn if divider 0 被替換為 do while 0 ok,講 了,連線符 concatenator 用來將兩個toke...
巨集定義中的
劉詩慧rubby的日誌 1 stringizing 字串化操作符 作用 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定 義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input string is...
巨集定義中的
以這個巨集定義為例 define err exit m do while 0 其中的 是怎麼回事?1 對於有引數的巨集定義,巨集定義時,在巨集名與帶引數的括號之間不應加空格,否則將空格以後的字元都作為替代字串的一部分。2 帶引數的巨集定義只是進行簡單的字元替換,巨集展開則是在編譯前進行的,在展開時並...