8

根据 C 语言标准, 和 之间的行#if 0#endif需要包含预处理标记,因此大多数类型的完全格式错误的语法,例如#fooor#include [bar]是允许的(默默地忽略);GCC 和 Microsoft C++ 确实默默地忽略了这些。

据我所知, An@不对应于任何预处理标记,因此仍然应该是语法错误。GCC 和 Microsoft C++ 默默地忽略它。这实际上是语言扩展还是我错过了什么?

#if 0有没有人真正使用在实践中使用格式错误的语法的能力#endif

4

3 回答 3

13

C 和 C++ 标准都在其语法中包含一个特殊的“转义子句”,这使得每个非空白字符都是(部分)预处理标记。#if 0出于这个原因,无论你在和之间放入一个块,#endif几乎都不会导致编译错误。唯一的例外是字符和字符串文字的引号不匹配。

是的,我经常将格式错误的语法放在#if 0#endif禁用一些部分编写的代码之间。

于 2013-01-07T11:31:43.257 回答
2

预处理器听起来像:它在(预)编译器之前处理文件。实际编译器看到的输入是预处理器提供给它的输入,如果部分代码介于#if 0和 匹配#endif,那么编译器甚至不会看到该代码。这就是为什么您可以在该部分中放置几乎任何东西,编译器根本看不到它。

于 2013-01-07T11:31:07.627 回答
2

#if 0 和 #endif 之间的代码不会包含在最终源代码中(在每个处理器输出之后)。如果您正在使用 Visual Studio 并希望查看预处理器的输出,请转到项目属性 -> 选择 C/C++ -> 选择预处理器 -> 在预处理到文件选项中选择“是”。

转到您的项目目录,您将看到“.i”文件。这是您的预处理器的输出。

您可以看到#if 0 和#endif 之间的代码不包括在内。所以没有错误的问题。

于 2013-01-07T11:51:24.850 回答