在一次审查中,我遇到了这样一段代码:
#if defined(x) || y
上面的说法是什么意思?条件是否会正确执行?
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
defined
x
y
0
8ehkhllq2#
其理由是双重的。不使用#ifdef,而是使用defined运算符,这样就可以在其上使用逻辑运算符(&&,||等),这样就不必重复代码,以便在需要定义多个条件时正确地包含它。另外,在我看来,我发现读成#if defined(x)比读成#ifdef x容易得多,你可以做下面的#if defined(x) && defined(y),而这是不可能的#ifdef。
#ifdef
&&
||
#if defined(x)
#ifdef x
#if defined(x) && defined(y)
yxyvkwin3#
是的,因为defined(x)是一个布尔值,返回true或false。上面的语句意味着“要么x被定义,要么y为真”。
defined(x)
s1ag04yj4#
这是正确的,但这是一种不好的做法。为什么在一个条件中使用两个不同的计算(y和defined(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:
AA
#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"
4条答案
按热度按时间tkclm6bt1#
是的,它是有效的。
以下是标准(C99)在6.10p1中的内容:
defined
运算符被视为常量表达式的一元运算符部分(6.10.1p1)。在您的示例中,如果定义了宏
x
,或者如果定义了y
并且与0
不同,则条件的计算结果为true8ehkhllq2#
其理由是双重的。
不使用
#ifdef
,而是使用defined
运算符,这样就可以在其上使用逻辑运算符(&&
,||
等),这样就不必重复代码,以便在需要定义多个条件时正确地包含它。另外,在我看来,我发现读成
#if defined(x)
比读成#ifdef x
容易得多,你可以做下面的#if defined(x) && defined(y)
,而这是不可能的#ifdef
。yxyvkwin3#
是的,因为
defined(x)
是一个布尔值,返回true或false。上面的语句意味着“要么x被定义,要么y为真”。
s1ag04yj4#
这是正确的,但这是一种不好的做法。为什么在一个条件中使用两个不同的计算(
y
和defined(x)
)?这可能会让其他人感到困惑。下面的示例显示了||
和&&
运算符对已定义宏的更常见用法:当上面的代码运行时,会产生以下警告:
如果
AA
是undefined:于是,这个警告就产生了: