關於C++宏定義的一個疑問?
在github上看到別人寫的一段代碼:
#define PP_JOIN(X, Y) PP_DO_JOIN(X, Y)
#define PP_DO_JOIN(X, Y) PP_DO_JOIN2(X, Y)
#define PP_DO_JOIN2(X, Y) X##Y
為什麼不直接寫
#define PP_JOIN(X, Y) X##Y
呢?
因為PP_JOIN(i_, __LINE__)想要得到i_246,而不是i___LINE__。
C++ 16.3.1
1 After the arguments for the invocation of a function-like macro have been identi?ed, argument substitution takes place. A parameter in the replacement list, unless preceded by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is replaced by the corresponding argument after all macros contained therein have been expanded.
16.3.3
2 If, in the replacement list of a function-like macro, a parameter is immediately preceded or followed by a ## preprocessing token, the parameter is replaced by the corresponding argument』s preprocessing token sequence;如果直接作為##的參數,其中的宏就不會被擴展,就像這裡的__LINE__;通過增加一層間接層,使其中的宏先行擴展,就可以得到正確的結果。
雖然我不知道為什麼要加兩層間接。。http://stackoverflow.com/questions/8231966/why-do-i-need-double-layer-of-indirection-for-macros有更合適找答案的地方就應該先用
推薦閱讀:
※我們用的計算機語言底層都是用什麼寫的?
※上溢後,結果為什麼可以用 (原值%對應數據類型最大值) 求出?
※在Visual Studio開發c++程序時,怎樣使用和管理第三方的開源庫?
※C++項目怎麼適用不同的linux系統?
※請問float的最大值是怎麼來的?