编译后未定义的宏参数会发生什么?

时间:2018-02-10 05:25:11

标签: c++ visual-c++ c-preprocessor

在我的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;逆向生成的字符串?

2 个答案:

答案 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(...) 

并承受能够使用任意数量的参数调用的后果。 [提示:建议使用第一个。]