在编译器的哪个阶段,检测到标识符名称的错误太长?

时间:2018-03-11 12:08:03

标签: c compiler-errors compilation

如果我有一个很长的标识符名称,那么编译器的哪个阶段就可以检测到这个错误。 另外,如果我有一个长范围的常量分配给变量,那么这有什么错误吗?

int a=1987655321467890008766555890765433111223;

1 个答案:

答案 0 :(得分:2)

C标准定义了八个翻译阶段:

  1. 物理源多字节字符和三字符序列映射到源字符集的字符。

  2. 删除后跟新行的每个反斜杠(拼接两行)。

  3. 源字符被分组为预处理标记,每个空白字符序列被一个空格替换,除了保留新行。

  4. 执行预处理指令和_Pragma运算符,并扩展宏调用。

  5. 字符串和字符常量中的源字符将转换为执行字符集。

  6. 连接相邻的字符串文字。

  7. 将每个预处理标记转换为语法标记,并丢弃分隔标记的空白字符。对得到的标记进行分析和翻译(编译)。

  8. 解析所有外部引用(程序已链接)。

  9. C标准没有规定在哪个阶段检测到名称或值中的问题,并且阶段主要是概念性的。这些阶段解释了如何理解C语言,而不是编译器必须如何执行。

    然而,鉴于此,第3阶段是检测名称太长的逻辑时间,特别是因为名称可以预处理标识符,而不仅仅是程序中变量的标识符。但是这也可以在阶段4中进行预处理标识符,或者7用于其他标识符。此外,编译器可能会接受第7阶段的长标识符,但第8阶段的链接器可能有更短的限制,因此错误可能发生在8中。

    编辑器根本无法处理的数字可能会在阶段3中被检测到,但更有可能是7。对于对于用于初始化的对象来说太大的数字,阶段7是检测问题的逻辑时间。