在一次审核中,我遇到了一段代码,如下所示:
#if defined(x) || y
上述陈述是什么意思?条件是否正确执行?
答案 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
答案 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"