这个问题在这里已有答案:
demo.c:
#if 0
What's the problem?
#endif
这产生(gcc)
demo.c:2:5: warning: missing terminating ' character
What's the problem?
^
但这编译:
#if 0
What{s the problem?
#endif
为什么编译器试图编译撇号?我认为#if 0 ... #endif
内的东西会被跳过。这并不像块的其余内容编译。
发生了什么?
编译器不会解析条件为false的条件包含内的文本,但它会:
(有关详细说明,请参阅C标准的§5.1.1.2 Translation Phases。)
由于标记化在预处理之前,因此即使在明确不包括的条件包含的块内(#if 0
),也必须正确终止注释,字符文字和字符串文字。
除此之外,这意味着您可以将#
放在注释和字符串文字中,而不必担心它们被解释为预处理程序指令。 (C没有多行字符串文字,但是C ++确实可以使用C的未来版本。)
处理完预处理指令后,结果流中的预处理标记(单独)被重新解释为程序标记,丢弃空格,组合连续字符串文字,并解析标记流。