我在gcc-9.3.1.
這是代碼。
#define A(_name) _name, _name, _name
#define P(_1, _2, _name, ...) _name
#define B(...) P(__VA_ARGS__, A(something))(__VA_ARGS__)
B(k)
我預期B(k)轉化為P(k, something, something, something)(k)先,然后轉化成something(k)。
但是,編譯器告訴我,兩個引數對于 來說太少了P,這意味著 A(something)沒有展開。
這是為什么?我怎樣才能讓它展開?
uj5u.com熱心網友回復:
B(k)擴展到P(k, A(something))(k)然后進行遞回擴展。它找到的第一件事是P,它沒有足夠的引數。
如果你想讓它像我認為的那樣作業,你需要A在P. 您可以通過添加顯式間接EXPAND宏來做到這一點:
#define EXPAND(...) __VA_ARGS__
#define B(...) EXPAND(P EXPAND((__VA_ARGS__, A(something))))(__VA_ARGS__)
這樣,在內部展開(也將展開 A)之前,P不會被識別為宏(無后續)。之后您需要外部顯式擴展。(EXPANDEXPANDP
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376897.html
上一篇:為什么使用cin函式會給我錯誤?
下一篇:使用std::map保持正確性
