【问题标题】:Boolean in ifdef: is "#ifdef A && B" the same as "#if defined(A) && defined(B)"?ifdef 中的布尔值:“#ifdef A && B”是否与“#if defined(A) && defined(B)”相同?
【发布时间】:2010-11-21 16:18:01
【问题描述】:

在 C++ 中,是这样的:

#ifdef A && B

同:

#if defined(A) && defined(B)

?

我以为不是,但我无法通过我的编译器 (VS2005) 找到不同之处。

【问题讨论】:

标签: c++ c-preprocessor conditional-compilation


【解决方案1】:

对于那些可能正在寻找与 OP 略有不同的示例 (UNIX/g++) 的人,这可能会有所帮助:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif

【讨论】:

  • 为什么不直接使用#elif 而不是#else #if 并在最后使用十亿个#endif...?
【解决方案2】:

截至 VS2015,上述方法均无效。正确的指令是:

#if (MAX && !MIN)

查看更多here

【讨论】:

  • 您已链接到 C# 文档,而不是 C++ 文档。
【解决方案3】:

以下结果相同:

1.

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2.

#ifdef A
#ifdef B
printf("define test");
#endif
#endif

【讨论】:

  • 您能否添加一些评论来描述这如何回答问题,从您的回答中不清楚。
  • 这个答案虽然在技术上是正确的,但并不能准确回答问题,并且暗示使用不正确。虽然这两个块会做同样的事情,但嵌套两个 if 与使用 && 是不同的。其他条件(例如#else)可能会导致问题。只有第一个选项实际上正是提问者所要求的。
【解决方案4】:

Conditional Compilation

您可以在 #if 指令使用表达式 在 a 内计算为 0 或 1 预处理器线。这使您免于 使用嵌套的预处理指令。 标识符周围的括号 是可选的。例如:

#if defined (MAX) && ! defined (MIN)  

不使用定义的运算符, 你必须包括 遵循两个指令来执行 上面的例子:

#ifdef max 
#ifndef min

【讨论】:

  • 虽然你说的是对的,但这根本不能回答问题,他问两者是否相同……它们不是。
  • 我认为它说“它们不一样”,您可以看到它解释了如何制作与 #ifdef COND_A 不同的 #if defined(COND_A) && defined(COND_B) && COND_B
  • 无论如何,这是一个有用的注释。
【解决方案5】:

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

test.cc:1:15: 警告:额外标记位于 #ifdef 指令结束

如果要检查是否定义了多个事物,请使用第二个。

【讨论】:

  • 感谢您的检查。我正在使用 Microsoft 的编译器,它似乎允许这样做,但对我来说似乎不合适。
  • 你不能用一些单一的编译器来证明事情。请参阅标准,其中指出这是无效的。
  • @LightnessRacesinOrbit 但是,一些编译器扩展了标准。说“它在某个编译器中工作”并不是为了证明它是有效的;值得注意的是,某个编译器以某种方式扩展了标准。
  • @QPaysTaxes:同意,但这个答案并没有这样做。它回答了一个以“在 C++ 中......”开头的问题,似乎是关于 C++ 的一般事实。乍一看,Evan 用一个编译器测试了他的理论,然后通过语言本身的保证假设它对所有人都是正确的。如果他确定此行为是 GCC 扩展并说“这是 GCC 扩展”(带有参考材料的链接),那没关系! (虽然不是这个特定问题的真正答案)
  • 虽然没有多少阳性测试可以“证明”它有效的,但一个阴性就足以证明它不是,或者至少是不可取的使用。虽然引用该标准会很好,但证明它在至少一个主要编译器中不起作用就足以证明“它不起作用”就本次讨论而言。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2015-06-12
  • 2021-10-06
  • 2014-03-29
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多