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

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

#if defined(x) || y 

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

是的,它是有效的。

这是标准(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

对此的推理是双重的。

您可以使用已defined运算符,而不是使用#ifdef ,以便您可以在其上使用逻辑运算符( &&||等),这样您就不必复制代码,以便在必要时将其包含在内。是您需要定义的多个标准。

另外, 在我看来 ,我觉得#if defined(x)#ifdef x更容易阅读,你可以执行以下#if defined(x) && defined(y) ,而这是不可能的#ifdef

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

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

这是正确的,但这是一个不好的做法。 为什么在一个条件中使用两个不同的评估(’y’和’defined(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"