【发布时间】:2018-07-20 21:59:09
【问题描述】:
在我的 VC++ 项目中,我使用宏进行调试和记录。
调用:
Logger(LogLevel::Info, "logging started");
宏:
#ifdef DEBUG
#define Logger(level, input) \
{ \
cerr << "[" << level << "] " << input << endl; \
};
#else
#define Logger();
#endif
编译时我收到以下警告(但它仍然编译):
警告 C4002:宏 'Logger' 的实际参数过多
我想知道编译器如何处理这种情况。 宏参数是否仍用于编译?例如。逆向工程中能看到“logging started”字符串吗?
【问题讨论】:
-
为什么不在#define中添加参数,然后不要在替换中使用它们?
-
@BenVoigt 这就是我目前所拥有的。我想知道这个描述的场景是如何工作的。也感谢您的反对。 SO 对新人来说很有趣。
-
@Thomas 它像往常一样通过纯文本替换解决了,并注明“特殊”。
-
在
#else中只需执行#define Logger(level, input)。那将忽略参数。此外,要改掉在宏定义末尾添加分号的习惯。最后,您显示的“通话”使用的是Log而不是Logger。 -
@Peter 我不能再编辑问题了。如果您查看编辑草稿,您会看到我将其更改为 Log。
标签: c++ visual-c++ c-preprocessor