【问题标题】:What does #define Dbg(fmt,...) (0) mean? warning: expression has no effect#define Dbg(fmt,...) (0) 是什么意思?警告:表达式无效
【发布时间】:2020-10-16 20:41:55
【问题描述】:

当我遇到以下宏时,我正在努力从遗留代码中删除警告

#define DISBALE_DEBUG
#ifdef DISBALE_DEBUG
    #define Dbg(fmt,...) (0) 
#else
    #define Dbg print
#endif

并在以下代码中使用:

#ifdef __arm__
    Dbg("\n %s %s %d  %d \n", __FILE__, __FUNCTION__, __LINE__, mode);
#endif

我收到警告:** 表达式无效**

【问题讨论】:

    标签: c++ c macros warnings compiler-warnings


    【解决方案1】:

    如果您进入DISBALE_DEBUG#ifdef 分支,Dbg 宏将被定义为a variadic macro,它只使用其可变参数,并且对它们不做任何事情。即,诸如

    之类的调用
    Dbg("\n %s %s %d  %d \n", __FILE__, __FUNCTION__, __LINE__, mode);
    

    将解决

    (0);
    

    正如编译器准确警告您的那样,它没有任何效果。

    另一方面,如果您进入#else 分支,则Dbg 宏将被预处理器替换为print,意思是

     Dbg("\n %s %s %d  %d \n", __FILE__, __FUNCTION__, __LINE__, mode);
    

    解决

    print("\n %s %s %d  %d \n", __FILE__, __FUNCTION__, __LINE__, mode);
    

    现在,鉴于您问题中的信息,尚不清楚print(...) 将解析为什么,因为它是is not a standard function in C++ nor C。它可能是另一个可变参数宏或variadic function

    【讨论】:

    • 非常感谢 :) 所以现在这个警告必须被禁止吗?因为它本来就是这样的。
    • 是的,你是正确的 print(...) 是另一个可变参数函数。
    • @XavierGeoffrey 如果您可以修改此宏,我想您可以尝试将其更改为#define Dbg(fmt,...) (void)(0) 以可能避免“表达式无效”警告。另请注意,根据您向我们展示的 sn-p,我们将始终进入 #ifdef 分支,并且宏将始终展开为空。最后,最好注意到预处理器常量中有一个拼写错误,DISBALE_DEBUG 应该是DISABLE_DEBUG,如果有人打算从构建系统中使用它,这可能会导致混淆。跨度>
    • @XavierGeoffrey 乐于助人!祝您的旧代码库好运,如果您遇到更多宏混乱,请考虑查看GCC's doc page on macros
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多