为什么C预处理器试图解析#if 0块中的引号? [重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

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内的东西会被跳过。这并不像块的其余内容编译。

发生了什么?

c-preprocessor
1个回答
1
投票

编译器不会解析条件为false的条件包含内的文本,但它会:

  • 解释三字母(已弃用,但仍在标准中)
  • 组合以延续字符结尾的行
  • 用空格替换注释
  • 将生成的文本划分为预处理标记
  • 识别预处理指令。

(有关详细说明,请参阅C标准的§5.1.1.2 Translation Phases。)

由于标记化在预处理之前,因此即使在明确不包括的条件包含的块内(#if 0),也必须正确终止注释,字符文字和字符串文字。

除此之外,这意味着您可以将#放在注释和字符串文字中,而不必担心它们被解释为预处理程序指令。 (C没有多行字符串文字,但是C ++确实可以使用C的未来版本。)

处理完预处理指令后,结果流中的预处理标记(单独)被重新解释为程序标记,丢弃空格,组合连续字符串文字,并解析标记流。

© www.soinside.com 2019 - 2024. All rights reserved.