#define Dbg(fmt,...) (0) 是什么意思?警告:表达式无效

What does #define Dbg(fmt,...) (0) mean? warning: expression has no effect

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

#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

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

如果您进入 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. It's likely another variadic macro or a variadic function