根据C语言标准,#if 0
和#endif
之间的行仅需要包含预处理令牌,因此大多数类型的完全格式错误的语法,例如允许#foo
或#include [bar]
(默默忽略); GCC和Microsoft C ++确实默默地忽略了这一点。
我认为@
并不对应任何预处理令牌,因此仍然是语法错误。 GCC和Microsoft C ++默默地忽略它。这实际上是语言扩展还是我遗漏了什么?
在实践中,有没有人真正使用在#if 0
和#endif
之间放置格式错误的语法?
答案 0 :(得分:13)
C和C ++标准在它们的语法中都包含一个特殊的“转义子句”,它使每个非空白字符都是(预处理)令牌的一部分。出于这个原因,无论你放在#if 0
和#endif
之间的块中,几乎都不会导致编译错误。唯一的例外是字符和字符串文字的引号不匹配。
是的,我经常在#if 0
和#endif
之间添加格式错误的语法来禁用部分编写的代码。
答案 1 :(得分:2)
预处理器听起来像是:它在编译器之前(之前)处理文件。实际编译器看到的输入是预处理器提供的输入,如果代码的一部分在#if 0
和匹配的#endif
之间,则编译器甚至不会看到该代码。这就是为什么你几乎可以把任何东西放在那个部分,编译器根本就看不到它。
答案 2 :(得分:2)
#if 0和#endif之间的代码不会包含在最终源代码中(在每个处理器输出之后)。如果您使用的是Visual Studio并希望查看预处理器的输出, 转到项目属性 - >选择C / C ++ - >选择预处理器 - >在“预处理到文件”选项中选择“是”。
转到项目目录,您将看到“.i”文件。这是预处理器的输出。
你可以看到#if 0和#endif之间的代码不包括在内。所以没有错误的问题。