gpt4 book ai didi

c - 为什么 C 预处理器不忽略它跳过的 block 中的无效指令?

转载 作者:行者123 更新时间:2023-12-01 22:19:23 24 4
gpt4 key购买 nike

考虑以下代码:

#if 0
#foobar
#endif

在这种情况下,预处理器不会提示 #foobar 不是有效的预处理器指令。它只是因为 #if 0 而跳过了代码块,并且代码编译正常。

现在考虑以下代码:

#if 0
#if 1
#endif

在这种情况下,预处理器突然提示缺少 #endif 指令。这让我感到困惑,因为它表明即使在 #if 0 的情况下,预处理器似乎也没有完全忽略 #if 0 block 中的内容。似乎 #if 指令仍然被解析,预处理器甚至会强制执行它们的正确性,即每个 #if 都需要与 #endif,即使是在跳过的 block 中。

以前,我的印象是使用 #if 0/#endif 封装一个 block 等同于使用 /* 注释它和 */。但显然情况并非如此。

因此我的问题是:

  1. 这种设计背后的基本原理是什么?为什么即使在使用某些指令(如 #if 0)明确告诉预处理器要跳过的 block 中,预处理器也会执行正确匹配的 #if 指令?

  2. 哪些指令确切地#if 0 block 中处理?如上例所示,预处理器不会提示像 #foobar 这样的无效预处理器指令,但会提示不匹配的 #if 指令。那么哪些预处理器指令实际上是在 #if 0 block 中处理的呢?仅 #if/#ifdef/#elif/#else/#endif或者是否有更多指令在 #if 0 block 中处理?

最佳答案

只处理可以改变控制流的指令。其余的,例如 #foobar 将被忽略1


1(引自:ISO/IEC 9899:201x 6.10.1 条件包含 6)
每个指令的条件按顺序检查。如果它的计算结果为假(零),则该组它控制的被跳过:仅通过确定的名称处理指令该指令是为了跟踪嵌套条件的级别;剩下的指令的预处理标记被忽略,与指令中的其他预处理标记一样组

关于c - 为什么 C 预处理器不忽略它跳过的 block 中的无效指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com