C语言 # if defined(x)||(y);这是有效的吗?

3lxsmp7m  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(203)

在一次审查中,我遇到了这样一段代码:

#if defined(x) || y

上面的说法是什么意思?条件是否会正确执行?

tkclm6bt

tkclm6bt1#

是的,它是有效的。
以下是标准(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

8ehkhllq

8ehkhllq2#

其理由是双重的。
不使用#ifdef,而是使用defined运算符,这样就可以在其上使用逻辑运算符(&&||等),这样就不必重复代码,以便在需要定义多个条件时正确地包含它。
另外,在我看来,我发现读成#if defined(x)比读成#ifdef x容易得多,你可以做下面的#if defined(x) && defined(y),而这是不可能的#ifdef

yxyvkwin

yxyvkwin3#

是的,因为defined(x)是一个布尔值,返回true或false。
上面的语句意味着“要么x被定义,要么y为真”。

s1ag04yj

s1ag04yj4#

这是正确的,但这是一种不好的做法。为什么在一个条件中使用两个不同的计算(ydefined(x))?这可能会让其他人感到困惑。下面的示例显示了||&&运算符对已定义宏的更常见用法:

#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是undefined:

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

相关问题