预计阅读本页时间:-
对程序作预处理前,编译器会对它进行几次翻译处理。编译器首先把源代码中出现的字符映射到源字符集。该过程处理多字节字符和使C外观更加国际化的三元字符(trigraph)扩展(参考资料7“扩展的字符支持”对这些字符扩展进行了综述)。
第二,编译器查找反斜线后紧跟换行符的实例并删除这些实例。也就是说,将类似下面的两个物理行:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
转换成一个逻辑行(logical line):
注意,在这种场合下,“换行符”代表按下回车键在源代码文件中新起一行所产生的字符,而不是符号\n代表的字符。
因为预处理表达式的长度为一逻辑行,所以这个功能为预处理做了准备工作。而一个逻辑行可能会比一个物理行多。
接下来,编译器将文本划分成预处理的语言符号(token)序列和空白字符及注释序列(术语语言符号代表由空格分隔的组。本章后面部分将详细讨论语言符号)。应注意的一点是编译器用一个空格字符代替每一个注释。因此,像下面的语句:
将变成:
C实现可能还会选用单个空格代替每一个空白字符(不包括换行符)序列。最后,程序进入预处理阶段。预处理器寻找可能存在的预处理指令。这些指令由一行开始处的#符号标识。