我看到了重载宏的不同解决方案和变通方法。但我似乎在这一点上遇到了困难。
我有一个PRINT_DEBUG
打印到 Visual Studio 调试器的宏:
#define DEBUG_PRINT(message, ...) _RPTN(0, message "\n", __VA_ARGS__)
现在说我想像这样重载它:
#define DEBUG_PRINT(message) _RPT0(0, message "\n")
#define DEBUG_PRINT(message, ...) _RPTN(0, message "\n", __VA_ARGS__)
这当然行不通,因为它会获取第一个宏。
所以我检查了其他主题并发现了这个solution https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments这是我的想法:
#define PRINT_DEBUG(...) _DEBUG_PRINT_SELECT(__VA_ARGS__, _DEBUG_PRINT2, _DEBUG_PRINT1, ...) (__VA_ARGS__)
#define _DEBUG_PRINT_SELECT(_1, _2, NAME, ...) NAME
#define _DEBUG_PRINT1(message) _RPT0(0, message "\n")
#define _DEBUG_PRINT2(message, ...) _RPTN(0, message "\n", __VA_ARGS__)
我尝试像这样使用它:
PRINT_DEBUG("My message");
PRINT_DEBUG("My message %s", someString);
PRINT_DEBUG("My message %s %d", someString, someValue);
我真的必须根据我拥有的参数数量对每一个进行硬编码吗?或者有什么创造性的方法可以做到这一点?
我发现的唯一解决方法是只有一个:
#define PRINT_DEBUG(message, ...) _RPTN(0, message "\n", __VA_ARGS__);
假设我只想打印一条消息,我必须在 mvsc 编译器中传递第二个参数:
PRINT_DEBUG("My message", NULL);
任何帮助将非常感激!提前致谢!