ifdef 中的布尔值:“#ifdef A && B”是不是与“#if defined(A) && defined(B)”相同?
Posted
技术标签:
【中文标题】ifdef 中的布尔值:“#ifdef A && B”是不是与“#if defined(A) && defined(B)”相同?【英文标题】: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) 找到不同之处。
【问题讨论】:
可能重复:***.com/questions/965700/… 我看到它们是 C 和 C++,但预处理器基本相同:***.com/questions/5085533/… 有人会引用和解释标准来决定它是否合法(它不应该肯定有效,但应该编译)?在阅读“16 条预处理指令”章节 15 分钟后,我无法阅读。 【参考方案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 扩展”(带有参考材料的链接),那没关系! (虽然不是这个特定问题的真正答案) 虽然没有多少阳性测试可以“证明”它是有效的,但一个阴性就足以证明它不是,或者至少是不可取的使用。虽然引用该标准会很好,但证明它在至少一个主要编译器中不起作用就足以证明“它不起作用”就本次讨论而言。以上是关于ifdef 中的布尔值:“#ifdef A && B”是不是与“#if defined(A) && defined(B)”相同?的主要内容,如果未能解决你的问题,请参考以下文章
将 SQL Server 中的 SELECT 中的布尔值转换为 C# 中的布尔值?
大摇大摆的布尔值作为字符串而不是 NestJS 中的布尔值发送