#if defined(x)|| (y);这有效吗?

时间:2012-03-30 15:35:16

标签: c

在一次审核中,我遇到了一段代码,如下所示:

#if defined(x) || y

上述陈述是什么意思?条件是否正确执行?

4 个答案:

答案 0 :(得分:25)

是的,它是有效的。

以下是标准(C99)在6.10p1中所说的内容:

if-group:
# if constant-expression new-line groupopt
# ifdef identifier new-line groupopt
# ifndef identifier new-line groupopt

defined运算符被视为常量表达式的一元运算符(6.10.1p1)。

在您的示例中,如果定义宏x或者y已定义且不同于0

,则条件评估为true

答案 1 :(得分:11)

这样做的理由是双重的。

您可以使用#ifdef运算符代替使用defined运算符,以便在其上使用逻辑运算符(&&||等),以便如果您需要定义多个条件,则不必复制代码,以便正确包含代码。

此外,在我看来,我觉得#if defined(x)#ifdef x更容易阅读,您可以执行以下#if defined(x) && defined(y),而#ifdef无法使用。

答案 2 :(得分:3)

是的,因为defined(x)是布尔值并返回true或false。

上述陈述的意思是“x是定义的,或者y是真的”。

答案 3 :(得分:1)

这是正确的,但这是一种不好的做法。为什么在一个条件中使用两种不同的评估(' y'和#39;定义(x)')。其他人可能会感到困惑。 以下示例显示了||的更常见用法和&&针对#defined宏的操作符:

#define AA  1
#define BB  2
#if (defined AA) || (defined BB)
    #warning "A or B"
#endif
#if (defined AA) && (defined BB)
    #warning "A and B"
#endif

当上述代码运行时,用户将在屏幕上显示以下消息:

#warning "A or B"
#warning "A and B"

但如果代码是这样的(AA未定义):

#undefine AA
#define BB  2
#if (defined AA) || (defined BB)
    #warning "A or B"
#endif
#if (defined AA) && (defined BB)
    #warning "A and B"
#endif

然后用户将收到此消息:

#warning "A or B"