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



考虑以下代码:

#if 0
   #foobar
#endif

在这种情况下,预处理器不抱怨#foobar不是有效的预处理器指令。它只是由于 #if 0而跳过块,并且代码可以罚款。

现在考虑以下代码:

#if 0
   #if 1
#endif

在这种情况下,预处理器突然抱怨有一个丢失的#endif指令。这让我感到困惑,因为它表明,即使在#if 0的情况下,预处理器似乎并没有完全忽略#if 0块中的内容。#if指令似乎仍在解析,预处理程序甚至会执行其正确性,即每个#if都需要由#endif匹配,即使是在跳过的块中。

以前,我的印象是,使用#if 0/#endif封装块的印象相当于使用/**/对其进行评论。但显然不是这样。

因此我的问题:

  1. 这种设计背后的理由是什么?为什么预处理程序也可以正确匹配的#if指令,即使在预处理器中明确告知预处理器通过使用#if 0等某些指令?

  2. 来跳过
  3. 哪些指令恰好在#if 0块中处理?如上所述,预处理器不会抱怨诸如#foobar之类的无效预处理器指令,但它确实抱怨无与伦比的#if指令。那么,实际上在#if 0块中处理了哪些预处理器指令?仅#if/#ifdef/#elif/#else/#endif或是否有更多指令在#if 0块中处理?

仅处理可以更改控制流的指令。其余的,例如#foobar 1


1 (引用来自:ISO/IEC 9899:201X 6.10.1条件包含6)
按顺序检查每个指令的状况。如果评估为false(零),则它跳过了它的控制:指令仅通过确定的名称处理指令以跟踪嵌套条件的水平;剩下的指令的预处理令牌被忽略组

最新更新