如果没有可变参数,如何实现与 VA_OPT 相反的效果,仅扩展。
您可以非常轻松地构建一个小的条件扩展宏,以便
VALUE_IF(1, args)
扩展为 args
和 VALUE_IF(0, args)
(或者在本例中也是 VALUE_IF(, args)
)扩展为空:
#define VALUE_IF_TEST(...)
#define VALUE_IF_TEST0(...)
#define VALUE_IF_TEST1(...) __VA_ARGS__
#define VALUE_IF(COND, ...) VALUE_IF_TEST ## COND ( __VA_ARGS__ )
然后你的“与
__VA_OPT__
相反”宏看起来像VALUE_IF(__VA_OPT__(1), value)
。如果有可变参数,这将扩展为 VALUE_IF(1, value)
和 value
;如果没有,则扩展为 VALUE_IF(, value)
和
(无)。
例如https://godbolt.org/z/n51jMvac5
#define TEST(...) VALUE_IF(__VA_OPT__(1), std::printf("TEST expanded on line %d with args %s\n", __LINE__, #__VA_ARGS__); )
int main() {
TEST() // (no output on line 11)
TEST(1) // TEST expanded on line 12 with args 1
TEST(1, 2) // TEST expanded on line 13 with args 1, 2
}