c++ - #define Dbg(fmt,…)(0)是什么意思?警告:表情无效

标签 c++ c macros warnings compiler-warnings

遇到以下宏时,我正在尝试从旧版代码中删除警告

#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);
现在,根据您问题中的信息,目前尚不清楚is not a standard function in C++ nor C将解决什么print(...)。可能是另一个可变参数宏或variadic function

关于c++ - #define Dbg(fmt,…)(0)是什么意思?警告:表情无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62591472/

相关文章:

c++ - 在每次执行时设置模板代码的类型

c++ - 多次提取和插入时奇怪的字符串流行为。

C++ 将模板类型作为参数传递给错误

c++ - 逗号运算符的局限性

c - 如何在不丢失任何信息的情况下将十六进制的 unsigned int[16] 转换为 unsigned char 数组?

c - 在 C 函数中定义唯一的全局程序集标签/符号

c - 这是一个使用堆栈检查 C 中括号平衡的程序,但它没有按预期工作

macros - 定义特征别名的宏

macros - Clojure 宏在调用时抛出 "CompilerException java.lang.IllegalStateException: Var clojure.core/unquote is unbound"

macros - 如果未设置某些宏,则阻止 systemverilog 编译