如果我有一个很长的标识符名称,那么编译器的哪个阶段就可以检测到这个错误。 另外,如果我有一个长范围的常量分配给变量,那么这有什么错误吗?
int a=1987655321467890008766555890765433111223;
答案 0 :(得分:2)
C标准定义了八个翻译阶段:
物理源多字节字符和三字符序列映射到源字符集的字符。
删除后跟新行的每个反斜杠(拼接两行)。
源字符被分组为预处理标记,每个空白字符序列被一个空格替换,除了保留新行。
执行预处理指令和_Pragma运算符,并扩展宏调用。
字符串和字符常量中的源字符将转换为执行字符集。
连接相邻的字符串文字。
将每个预处理标记转换为语法标记,并丢弃分隔标记的空白字符。对得到的标记进行分析和翻译(编译)。
解析所有外部引用(程序已链接)。
C标准没有规定在哪个阶段检测到名称或值中的问题,并且阶段主要是概念性的。这些阶段解释了如何理解C语言,而不是编译器必须如何执行。
然而,鉴于此,第3阶段是检测名称太长的逻辑时间,特别是因为名称可以预处理标识符,而不仅仅是程序中变量的标识符。但是这也可以在阶段4中进行预处理标识符,或者7用于其他标识符。此外,编译器可能会接受第7阶段的长标识符,但第8阶段的链接器可能有更短的限制,因此错误可能发生在8中。
编辑器根本无法处理的数字可能会在阶段3中被检测到,但更有可能是7。对于对于用于初始化的对象来说太大的数字,阶段7是检测问题的逻辑时间。