2012-02-09 130 views
1

如果我的文件的开头我预处理宏

#define dbg_kprintf \ 
    if (x_var) kprintf 

我迟到不使用语句

dbg_kprintf ("blablabla"); 

我的问题是,将dbg_kprintf只有当XVAR定义别的地方定义呢?如果不是,那么编译时不会使用dbg_kprintf语句吗?

谢谢。

回答

3

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


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

不,这将编译为变量的运行时检查,或者什么都不编译(如果变量实际上是编译时常量,且值为假,优化器感觉就像消除了死代码)或者调用总是(如果它是一个具有真实值的编译时常量)。所以,现在你知道了。

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

0

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

1

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

#define foo(X) ((X))