關於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的最大值是怎麼來的?

TAG:編程語言 | 編程 | C | CC |