繁体   English   中英

C++ 调试宏在发布模式下编译失败

[英]C++ Debug macro failing compile in release mode

我正在使用视觉工作室(2019)并且我有这个宏:

#if _DEBUG
#define EngineLog(vars, ...) Log(vars, ##__VA_ARGS__)
#endif

我的日志功能是:

template<typename... args>
static void Log(args && ... inputs)
{
    std::osyncstream bout(std::cout);
    bout << ENGINE_TAG;
    ([&]()  {
        bout << inputs;
    } (), ...);

    bout << "\n";
}

显然,当我处于调试模式时,这可以正常工作,但是当我使用发布模式时,我得到:

Error   C3861   'EngineLog': identifier not found

我不确定为什么编译器会在这里出现问题,我被告知它会在未定义时从代码中删除宏,但它似乎没有这样做。

如果_DEBUG未定义,则EngineLog是未解析的名称。 您需要为另一种情况添加定义。

#if _DEBUG
    #define EngineLog(vars, ...) Log(vars, ##__VA_ARGS__)
#else
    #define EngineLog(vars, ...) (0 && Log(vars, ##__VA_ARGS__))
#endif

此处使用的语法可防止任何有关未使用可变参数的潜在警告,同时防止调用函数及其评估其参数。

看起来您需要一个#else预处理器案例来定义带有空扩展的宏调用:

#if _DEBUG
    #define EngineLog(vars, ...) Log(vars, ##__VA_ARGS__)
#else
    #define EngineLog(vars, ...)
#endif

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM