在C编程中,编译阶段和翻译阶段之间有什么关系.我们可以根据编译阶段对翻译阶段进行分类吗?有谁能解释一下这个吗?

推荐答案

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

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

  2. 每个反斜杠后跟一个换行符都会被删除(将两行拼接在一起).

  3. 源字符被分组到预处理标记中,每个空白字符序列都被替换为一个空格,但保留换行符.

  4. 执行预处理指令和_Pragma操作符,并展开宏调用.

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

  6. 相邻的字符串字面值连接在一起.

  7. 每个预处理标记都被转换为语法标记,并且空白字符分隔的标记被丢弃.分析和翻译(编译)生成的令牌.

  8. 所有外部参照都已解析(程序已链接).

第一阶段到第六阶段通常被认为是初步的或"预处理".编译的主要工作是在阶段7,"分析并翻译(编译)得到的令牌".

这些阶段在很大程度上是概念性的,用于描述C程序的语义,而不是指定工作是如何实际完成的.阶段1到6不一定是在编译期间按时间顺序执行的;它们可以内置于编译器的 struct 中.这甚至可能包括第七阶段.

阶段8通常作为单独的步骤执行,使用单独的链接器而不是编译器.

C++相关问答推荐

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

C中出现分段错误后关闭文件

理解C版宏(看起来像未声明的变量?)

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

S将C语言宏定义为自身的目的是什么?(在glibc标题中看到)

S的这种管道实施有什么问题吗?

是否定义了此函数的行为?

C标准关于外部常量的说明

如何将大写/小写土耳其字母相互转换?

try 判断长整数是否为素数

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

令人困惑的返回和 scanf 问题相关

Struct 内的数组赋值

为什么写入关闭管道会返回成功

使用复合文字数组初始化的指针数组

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

快速准确计算double的小数指数

nullptr_t 是否会 destruct 类型双关或指针转换?

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值

Zig 中 C 的system函数的惯用替代方案