ifdef中的布尔值:"#ifdef A && B"与"#if defined(A)&& defined(B)"相同?

cri*_*ell 76 c++ conditional-compilation c-preprocessor

在C++中,是这样的:

#ifdef A && B
Run Code Online (Sandbox Code Playgroud)

同样如下:

#if defined(A) && defined(B)
Run Code Online (Sandbox Code Playgroud)

我当时认为它不是,但我无法找到与我的编译器(VS2005)的差异.

Eva*_*ran 81

他们不一样.第一个不起作用(我在gcc 4.4.1中测试过).错误消息是:

test.cc:1:15:警告:#ifdef指令末尾的额外令牌

如果要检查是否定义了多个内容,请使用第二个.

  • 您无法使用单个编译器来证明事物.请参阅标准,该标准指出这是无效的. (2认同)
  • 虽然没有多少阳性测试可以“证明”它是有效的,但一次阴性就足以证明它不是,或者至少不建议使用。虽然引用该标准固然很好,但为了本次讨论的目的,证明它在至少一个主要编译器中不起作用就足以证明“它不起作用”。 (2认同)

Sve*_*lov 44

条件编译

您可以使用#if指令中定义的运算符来使用在预处理器行中计算为0或1的表达式.这样可以避免使用嵌套的预处理指令.标识符周围的括号是可选的.例如:

#if defined (MAX) && ! defined (MIN)  
Run Code Online (Sandbox Code Playgroud)

如果不使用已定义的运算符,则必须包含以下两个指令才能执行上述示例:

#ifdef max 
#ifndef min
Run Code Online (Sandbox Code Playgroud)

  • 虽然你说的是对的,但这根本没有回答问题,他问这两者是否相同……它们不是。 (2认同)
  • 我认为它说“它们不一样”,你可以看到它解释了如何等效于 #if Defined(COND_A) && Defined(COND_B) ,这与 #ifdef COND_A && COND_B 不同 (2认同)