我發現an interesting little blog post,說明如何通過使用行號以產生一個宏(半)唯一的名字:爲什麼這個級聯宏需要一個間接級別?
// Do magic! Creates a unique name using the line number
#define LINE_NAME(prefix) JOIN(prefix, __LINE__)
#define JOIN(symbol1, symbol2) _DO_JOIN(symbol1, symbol2)
#define _DO_JOIN(symbol1, symbol2) symbol1##symbol2
這裏有兩件事情,真的讓我困惑:
- 爲什麼會出現
LINE_NAME
如果在文件中聲明JOIN
後宏甚至可以工作?我認爲C預處理器做了一個線性傳遞,因此需要根據依賴性來定義宏,就像C函數在使用之前需要定義一樣。 - 爲什麼需要同時使用
JOIN
和_DO_JOIN
宏才能獲得正確的結果?在宏中具有這種間接級別似乎很奇怪。
我有一種感覺,這兩個問題的答案都是相關的,並且與C預處理器評估宏的方式有關。 (然而,我對宏如何工作的直覺很明顯,因爲我甚至都沒有想到這個例子是有效的。)
可能重複[爲什麼我需要宏的雙層間接?](http://stackoverflow.com/questions/8231966/why-do-i-need-double-layer-of-indirection-for -macros) – Antonio