c99编译顺序

本文详细介绍了C语言源代码从文件读取到编译单元生成的八个阶段,包括字符映射、行连接、分解为预处理标记、执行预处理指令、字符集转换、字符串字面量连接、标记转换与语法分析,以及外部引用解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.       Physical source file multibyte characters are mapped, in an implementation-defined manner, to the source character set (introducing new-line characters for end-of-line indicators) if necessary. Trigraph sequences are replaced by corresponding single-character internal representations.
将源文件中多字节字符映射成编译器定义的单字节字符


2.       Each instance of a backslash character (/) immediately followed by a new-line character is deleted, splicing physical source lines to form logical source lines. Only the last backslash on any physical source line shall be eligible for being part of such a splice. A source file that is not empty shall end in a new-line character, which shall not be immediately preceded by a backslash character before any such splicing takes place.
将行末的反斜杠(‘/’)及新行符去掉,然后将实际行连接成逻辑意义上的行


3.       The source file is decomposed into preprocessing tokens and sequences of white-space characters (including comments). A source file shall not end in a partial preprocessing token or in a partial comment. Each comment is replaced by one space character. New-line characters are retained. Whether each nonempty sequence of white-space characters other than new-line is retained or replaced by one space character is implementation-defined.
将注释用一个空白符号代替,出了新行符之外的空白符号按编译器定义的方法处理(比如全部用一个空白符号代替)

 

4.       Preprocessing directives are executed, macro invocations are expanded, and _Pragma unary operator expressions are executed. If a character sequence that matches the syntax of a universal character name is produced by token concatenation (6.10.3.3), the behavior is undefined. A #include preprocessing directive causes the named header or source file to be processed from phase 1 through phase 4, recursively. All preprocessing directives are then deleted.
执行预处理指令,展开宏调用,执行_Pragma表达式,并对#include所引用的头文件或源文件进行1-4步的递归处理,之后删掉所有预处理指令。


5.       Each source character set member and escape sequence in character constants and string literals is converted to the corresponding member of the execution character set; if there is no corresponding member, it is converted to an implementation-defined member other than the null (wide) character.
将源字符集成员、转义序列和字符字面量转换成对应的执行字符集成员,若没有对应成员则转换成编译器定义的非空字符。


6.       Adjacent string literal tokens are concatenated
连接字符串字面量


7.       White-space characters separating tokens are no longer significant. Each preprocessing token is converted into a token. The resulting tokens are syntactically and semantically analyzed and translated as a translation unit.
隔开记号的空白字符被忽略,每个预处理记号被转换成记号,最后将所有记号依据语法和语义编译成一个编译单元


8.       All external object and function references are resolved. Library components are linked to satisfy external references to functions and objects not defined in the current translation. All such translator output is collected into a program image which contains information needed for execution in its execution environment
处理全局对象及函数调用,若编译时还未定义外部引用,编译器的输出将被一个包含了当前执行环境下所需的执行信息的程序映像所收集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值