#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"