城市直播房产教育博客汽车
快传网
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

C语言编译的8个阶段(文本处理预处理编译链接等)

6月6日 顾昀汐投稿
  TheCsourcefileisprocessedbythecompilerasifthefollowingphasestakeplace,inthisexactorder。Actualimplementationmaycombinetheseactionsorprocessthemdifferentlyaslongasthebehavioristhesame。
  编译器对C源文件进行处理,就好像以下阶段按照这个确切的顺序进行一样。只要行为相同,实际实现可能会组合这些操作或以不同的方式处理它们。Phase1字符映射
  Theinpidualbytesofthesourcecodefile(whichisgenerallyatextfileinsomemultibyteencodingsuchasUTF8)aremapped,inimplementationdefinedmanner,tothecharactersofthesourcecharacterset。Inparticular,OSdependentendoflineindicatorsarereplacedbynewlinecharacters。
  源代码文件的各个字节(通常是一些多字节编码(如UTF8)的文本文件)以实现定义的方式映射到源字符集的字符。特别是,依赖操作系统的行尾指示符被换行符所取代。(不同的字符集对同一个汉字的编码可能是不同的。)
  Thesourcecharactersetisamultibytecharactersetwhichincludesthebasicsourcecharactersetasasinglebytesubset,consistingofthefollowing96characters:
  源字符集是一个多字节字符集,包括作为单字节子集的基本源字符集,由以下96个字符组成:a)5whitespacecharacters(space,horizontaltab,verticaltab,formfeed,newline)
  5个空格字符(空格、水平制表符、垂直制表符、换页符、换行符)
  b)10digitcharactersfrom0to9
  从0到9的10位数字字符
  c)52lettersfromatozandfromAtoZ
  从a到z以及从a到z的52个字母
  d)29punctuationcharacters:{}〔〕():;。?!,
  29个标点符号:{}〔〕35;():;。?!,
  Trigraphsequencesarereplacedbycorrespondingsinglecharacterrepresentations。
  三角图序列由相应的单字符表示代替。Phase2物理换行替换为逻辑换行
  1)Wheneverbackslashappearsattheendofaline(immediatelyfollowedbythenewlinecharacter),bothbackslashandnewlinearedeleted,combiningtwophysicalsourcelinesintoonelogicalsourceline。Thisisasinglepassoperation:alineendingintwobackslashesfollowedbyanemptylinedoesnotcombinethreelinesintoone。
  每当反斜杠出现在行尾(紧跟着换行符),反斜杠和换行符都会被删除,将两个物理源行合并为一个逻辑源行。这是一个单程操作:一条以两个反斜杠结尾并后跟空行的行不会将三行合并为一行。
  2)Ifanonemptysourcefiledoesnotendwithanewlinecharacterafterthisstep(whetherithadnonewlineoriginally,oritendedwithabackslash),thebehaviorisundefined。
  如果非空源文件在此步骤之后没有以换行符结尾(无论它最初是否没有换行符,或者以反斜杠结尾),则行为未定义。Phase3单条注释替换为一个空格
  3。1Thesourcefileisdecomposedintocomments,sequencesofwhitespacecharacters(space,horizontaltab,newline,verticaltab,andformfeed),andpreprocessingtokens,whicharethefollowing
  源文件分解为注释、空格字符序列(空格、水平制表符、新行、垂直制表符和表单提要)和预处理标记,如下所示a)headernames:stdio。hormyfile。h
  b)identifiers
  c)preprocessingnumbers,whichcoverintegerconstantsandfloatingconstants,butalsocoversomeinvalidtokenssuchas1。。E3。fooor0JBK
  预处理数字,包括整数常量和浮点常量,但也包括一些无效标记,如1。。E3。foo或0JBK
  d)characterconstantsandstringliterals
  字符常量和字符串文字
  e)operatorsandpunctuators,suchas,,,or。
  运算符和标点符号,如、、或。
  f)inpidualnonwhitespacecharactersthatdonotfitinanyothercategory
  不适用于任何其他类别的单个非空白字符
  3。2Eachcommentisreplacedbyonespacecharacter
  每个注释都替换为一个空格字符
  3。3Newlinesarekept,anditsimplementationdefinedwhethernonnewlinewhitespacesequencesmaybecollapsedintosinglespacecharacters。
  保留换行符,它的实现定义了非换行符空格序列是否可以折叠为单个空格字符。
  Iftheinputhasbeenparsedintopreprocessingtokensuptoagivencharacter,thenextpreprocessingtokenisgenerallytakentobethelongestsequenceofcharactersthatcouldconstituteapreprocessingtoken,evenifthatwouldcausesubsequentanalysistofail。Thisiscommonlyknownasmaximalmunch。
  如果输入已被解析为预处理标记(最多可达给定字符),则下一个预处理标记通常被视为可能构成预处理标记的最长字符序列,即使这会导致后续分析失败。这通常被称为贪婪原则(最大吞噬)。intfoo1;intbar0xEerror:invalidpreprocessingnumber0xEfoointbaz0xEOKOK:OK:error:barbaz,notbarbaz。
  Thesoleexceptiontothemaximalmunchruleis:
  贪婪规则(最大吞噬)的唯一例外是:
  Headernamepreprocessingtokensareonlyformedwithinaincludedirectiveandinimplementationdefinedlocationswithinapragmadirective。
  头文件预处理标记仅在include指令内和pragma指令内实现定义的位置中形成。defineMACRO11defineMACRO22defineMACRO33defineMACROEXPR(MACRO1MACRO2MACRO3)OK:MACRO2isnotaheadernamePhase4预处理
  1)Preprocessorisexecuted。
  执行预处理器。
  2)Eachfileintroducedwiththeincludedirectivegoesthroughphases1through4,recursively。
  使用include指令引入的每个文件都会递归地经历阶段1到4。
  3)Attheendofthisphase,allpreprocessordirectivesareremovedfromthesource。
  在此阶段结束时,将从源代码中删除所有预处理器指令。Phase5字符集转换
  1)Allcharactersandescapesequencesincharacterconstantsandstringliteralsareconvertedfromsourcecharactersettoexecutioncharacterset(whichmaybeamultibytecharactersetsuchasUTF8,aslongasall96charactersfromthebasicsourcecharactersetlistedinphase1havesinglebyterepresentations)。Ifthecharacterspecifiedbyanescapesequenceisntamemberoftheexecutioncharacterset,theresultisimplementationdefined,butisguaranteedtonotbeanull(wide)character。
  字符常量和字符串文字中的所有字符和转义序列都从源字符集转换为执行字符集(可以是多字节字符集,如UTF8,只要阶段1中列出的基本源字符集中的所有96个字符都具有单字节表示)。如果转义序列指定的字符不是执行字符集的成员,则结果是实现定义的,但保证不是空(宽)字符。当源文件被转换为可执行程序以后,这些由字符所组成的源代码,都将被替换为实现了相同功能的机器指令。但是,源文件中的字符串、字符常量等信息文本,并不会被替换为相应的机器指令。因为,它们并不对应某个功能,它们一般是用来打印和输出、传输。所以,它们在可执行文件(程序)中存储的仍然是其所对应的字符编码。
  接下来的问题是:字符串、字符常量等信息文本在可执行文件中是按照哪种字符编码来存储的?这是由gcc来决定的:Linux下gcc默认使用UTF8来存储这些信息文本到可执行文件中。
  Note:theconversionperformedatthisstagecanbecontrolledbycommandlineoptionsinsomeimplementations:gccandclangusefinputcharsettospecifytheencodingofthesourcecharacterset,fexeccharsetandfwideexeccharsettospecifytheencodingsoftheexecutioncharactersetinthestringliteralsandcharacterconstantsthatdonthaveanencodingprefix(sinceC11)。
  注意:在某些实现中,此阶段执行的转换可以由命令行选项控制:gcc和clang使用finputcharset指定源字符集的编码,fexeccharset和fwideexeccharset指定没有编码前缀的字符串文字和字符常量中执行字符集的编码(自C11起)。Phase6相邻的字符串字面量串联到一起
  Adjacentstringliteralsareconcatenated。
  相邻的字符串文字是串联的。
  从ANSIC标准起,如果字符串字面量之间没有间隔,或者用空白字符分隔,C会将其视为串联起来的字符串字面量。例如:chargreeting〔20〕Hello,andhowareyoutoday!;
  与下面的代码等价:chargreeting〔5O〕Hello,andhowareyoutoday!;Phase7编译
  Compilationtakesplace:thetokensaresyntacticallyandsemanticallyanalyzedandtranslatedasatranslationunit。
  编译发生:标记在语法和语义上进行分析,并作为翻译单元进行翻译。Phase8链接
  Linkingtakesplace:Translationunitsandlibrarycomponentsneededtosatisfyexternalreferencesarecollectedintoaprogramimagewhichcontainsinformationneededforexecutioninitsexecutionenvironment(theOS)。
  链接发生:满足外部引用所需的翻译单元和库组件被收集到一个程序映像中,其中包含在其执行环境(OS)中执行所需的信息。
  End
投诉 评论 转载

再聊结伴自驾游怎样解决费用分摊吃住矛盾等问题〔可爱〕一直认为,在国内自驾游,开自己的车才是真正愉快自由的自驾游,喜欢组团自驾游的话,最好23车,因为:一车4人好聊天,2车一桌人好吃饭,最多别超过3车!阿里大北线……C语言编译的8个阶段(文本处理预处理编译链接等)TheCsourcefileisprocessedbythecompilerasifthefollowingphasestakeplace,inthisexactorder。A……新华财经政策性开发性金融工具成扩大有效投资关键一招新华社北京1月17日电2022年下半年至今,一大批重大项目在神州大地上如火如荼地建设着。而这些项目的迅速开工、加快形成实物工作量,一定程度上得益于政策性开发性金融工具(以下简称……电脑能挖比特币吗?别天真了,赚币的方法只有这些看看价格就知道了。目前比特币的价格已经涨到了18000美元片(折合12万人民币)。看到比特币的价格不断上涨,最近有很多焦虑的朋友来问我,我能做比特币吗?可以一个人待在家里……iPhone15系列主打省电?处理器a17主打功耗比iPhone15系列看思路,主打的是省电?这个手机要使用台积电的3纳米制程,a17处理器,这个处理器主要是省电,当然这也是a17处理器主打的,功耗比是这个处理器的关键,但……赶出口订单冲刺全年红2022年12月9日,安徽省安庆市一家车桥公司生产车间内,员工正在打包出口北美的订单产品。年关将至,安庆市一批高新企业开足马力,组织工人加紧生产,冲刺四季度,力争全年红。(江胜……黄石这些地方暂停开放!最新消息黄石这些场馆和景区暂停开放黄石规划展示馆临时闭馆公告广大市民:根据疫情防控要求,黄石规划展示馆将于2022年11月27日下午2:00起暂停……阳了不舒服吃什么?推荐多喝3碗汤,开胃补营养,润肺去火阳了不舒服吃什么?推荐多喝3碗汤,开胃补营养,润肺去火最近中招的人真不少,我们一家三口也都没逃过去,虽说现在已经一周了,但还是很不舒服,建议各位最近出门,一定要做好防护。……重庆你飘了!亚洲第一悬崖秋千,荡一下魂飞魄散,你敢去吗重庆,一个被称为8D魔都的城市。8D魔都的外号并不是白来的,而是它将高空运用到极致的原因,上天入地,极致刺激。过河用的是缆车,在高空晃晃荡荡。坐个地铁,都能一……CES2023英特尔打造性能出众的移动处理器,尽显性能王者风全新第13代英特尔酷睿移动处理器为300多款笔记本电脑提供令人震撼的性能和卓越的体验。视频加载中。。。新闻要点英特尔发布了第13代英特尔酷睿移动处理器家族。作……混迹职场,不想陷入被动的局面,就应该有这几个觉悟头条创作挑战赛职场是比较考验人性的地方,人性的善与恶会被发挥淋漓尽致。遇到善我们应该学会感恩,遇到恶也别总想着反击,最应该做的是反思。不反击不是懦弱,而是弥补自己的……又是50分!NBA名嘴16个50分都比不过科比一个81分!又是50分!本赛季还未过半,单场50的变态数据是一茬又一茬!NBA各界是如何看待这个现象的?字母哥面对奇才砍下55分10篮板7助攻,在近4天已经有4个50诞生在东契……
运城永乐宫绝美的东方艺术画廊全球航天将迎来登月年,多种深空探测器让国际航天界充满期待开箱评测iKFFindAir5双十一新品耳机开箱注意!来(返)海南这几个市县的人员,请先看通告世界杯8强诞生7席!摩洛哥打破欧美垄断,巴西保送4强,3大洲巩俐姐姐把嫁妆塞给自己当学费,姐姐去世,巩俐含泪把孩子养大2023音响铭机奖出炉,看看日本人心目中的HiEnd音响有哪RaspberryPi5不会在明年推出,至少还要等到2024斯诺克冠中冠特鲁姆普连胜晋级4强,小组决赛轰7杆高分击溃艾伦2022甘肃乡村旅游乐享金秋推广发布活动举行Quest系列新产品MetaQuestPro曝光!Quest九年十季跑男,Angelababy颜值最好的是哪一季?
果然是好夫妻,竟然同时酒驾,一个自首,一个被抓从C罗队友到转投梅西?他本该是曼联领军人:却毁于糟糕的管理热 胜田雅史上海电力的清洁能源发电项目,弥补了日本电力缺口一旦对你动了真情的男人才不会让你受委屈请珍惜“跳过导航”链接一个女人,最重要的从来不是婚姻,而是拥有这三样东西热评聚热点 瓶口逃生外媒报告仁宝电脑将负责iPadmini5组装古巴媒体两国领导人为古中关系不断注入新活力杰士邦避孕套正品价格是多少世间最遥远的距离不甘做朋友不敢做恋人余秀华的人品有问题吗?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找江西南阳嘉兴昆明铜陵滨州广东西昌常德梅州兰州阳江运城金华广西萍乡大理重庆诸暨泉州安庆南充武汉辽宁