考虑以下代码:
#if 0
#foobar
#endif
在这种情况下,预处理器不抱怨#foobar
不是有效的预处理器指令。它只是由于 #if 0
而跳过块,并且代码可以罚款。
现在考虑以下代码:
#if 0
#if 1
#endif
在这种情况下,预处理器突然抱怨有一个丢失的#endif
指令。这让我感到困惑,因为它表明,即使在#if 0
的情况下,预处理器似乎并没有完全忽略#if 0
块中的内容。#if
指令似乎仍在解析,预处理程序甚至会执行其正确性,即每个#if
都需要由#endif
匹配,即使是在跳过的块中。
以前,我的印象是,使用#if 0
/#endif
封装块的印象相当于使用/*
和*/
对其进行评论。但显然不是这样。
因此我的问题:
这种设计背后的理由是什么?为什么预处理程序也可以正确匹配的
#if
指令,即使在预处理器中明确告知预处理器通过使用#if 0
等某些指令?
来跳过哪些指令恰好在
#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(零),则它跳过了它的控制:指令仅通过确定的名称处理指令以跟踪嵌套条件的水平;剩下的指令的预处理令牌被忽略组