在我的VC ++项目中,我使用宏来进行调试和记录。
主叫:
Logger(LogLevel::Info, "logging started");
宏:
#ifdef DEBUG
#define Logger(level, input) \
{ \
cerr << "[" << level << "] " << input << endl; \
};
#else
#define Logger();
#endif
编译时,我收到以下警告(但仍会编译):
警告C4002:宏&#39; Logger&#39;
的实际参数太多
我想知道编译器如何处理这种情况。 宏参数是否仍用于编译?例如。将能够看到&#34;记录开始&#34;逆向生成的字符串?
答案 0 :(得分:3)
我想知道编译器如何处理这种情况。宏参数是否仍用于编译?
在预处理阶段处理宏。如果预处理器能够处理宏使用中使用的额外参数,那么它唯一能做的就是在宏扩展中删除这些参数。
E.g。是否可以在逆向工程中看到“记录开始”字符串?
不,编译器处理的代码根本就没有该行。
如果您可以选择更改这些代码行,我建议您将宏的非调试定义更改为noop扩展。 E.g:
#define Logger(level, input) (void)level;
答案 1 :(得分:1)
根据法律规定,宏函数必须声明与调用它一样多的参数。
所以调用你的宏
#define Logger()
因Logger(LogLevel::Info, "logging started")
导致错误。 MSVC可能允许它,因为它不符合标准。进一步推理并不多(这是我对实际问题的回答)。
你要么
#define Logger(unused,unused2)
并将替换部件留空或
#define Logger(...)
并承受能够使用任意数量的参数调用的后果。 [提示:建议使用第一个。]