#if 0之后你究竟能放到什么?

时间:2013-01-07 11:11:27

标签: c++ c c-preprocessor

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

我认为@并不对应任何预处理令牌,因此仍然是语法错误。 GCC和Microsoft C ++默默地忽略它。这实际上是语言扩展还是我遗漏了什么?

在实践中,有没有人真正使用在#if 0#endif之间放置格式错误的语法?

3 个答案:

答案 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之间的代码不包括在内。所以没有错误的问题。