3
從C語言程序設計,通過KRC嵌套宏和##
後
#define cat(x, y) x ## y
通話
cat(var, 123)
產量var123
。但是,呼叫cat(cat(1,2),3)
未定義:##
的存在阻止 外部呼叫的參數被擴展。因此它 產生標記字符串cat ( 1 , 2 )3
和)3
(第一個參數的最後一個標記與第二個標記的第一個標記 的連接)不是合法標記。如果引入宏定義的第二級,
#define xcat(x, y) cat(x,y)
事情的工作更加順利;
xcat(xcat(1, 2), 3)
確實產生123
,因爲xcat
本身的擴展本身不涉及##
算子。
##
的性質是什麼,使兩個例子有所不同?
爲什麼第一個示例中的內部cat(1,2)
未展開,而第二個示例中的內部xcat(1,2)
是?
謝謝!
感謝。你能解釋爲什麼「通過使用你正在解決問題的xcat宏實現額外的間接尋址」? – Tim
如果「xcat(xcat(1,2),3)確實產生了123」,那麼每個「xcat(a,b)」將首先擴展爲「cat(a,b)」,然後是'a ## b'。我猜外面的'xcat'首先被擴展,接着是內部的'xcat',所以當第一次出現##時,它將阻止任何進一步的擴展,然後爲什麼會說「xcat(xcat ),3)產生123「? – Tim