预处理宏

时间:2012-02-09 15:59:56

标签: c++ c

如果在我的文件的开头我做

#define dbg_kprintf \
   if (x_var) kprintf

我迟到了使用

做的陈述
dbg_kprintf ("blablabla");

我的问题是,只有在其他地方定义xvar时才会定义dbg_kprintf吗?如果不是,则编译时不会使用dbg_kprintf语句吗?

感谢。

4 个答案:

答案 0 :(得分:4)

不,那将编译成变量的运行时检查,或者什么都没有(如果变量实际上是编译时常量,带有false值,优化器就像消除死代码那样)或者总是调用(如果它是具有真值的编译时常量)。所以,现在你知道了。

确保从非调试版本中排除调试代码的典型方法是使用预处理程序符号来保护代码。请注意,可能需要您以不同方式管理参数。

答案 1 :(得分:3)

不,在该示例中,x_var必须存在于某处,否则将无法编译。您正在寻找类似

的内容

#if (x_var)
  #define dbg_kprintf kprintf
#else
  #define dbg_kprintf
#endif

答案 2 :(得分:1)

在C / C ++中,宏可以接受参数。它将以任何一种方式定义,因为它只是一个预处理指令,但如果没有定义,编译将失败。要将参数传递给宏,请使用此语法

#define foo(X)  ((X))

答案 3 :(得分:0)

在编译时,

dbg_kprintf将在之前使用。预处理器将在其位置替换您定义的内容:if (x_var) kprintf。然后它会尝试正常编译你的代码。