安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

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诞生在东契……
祛湿除寒,试试这4种草,能够搜刮骨缝里的寒毒,请收藏中国人去越南旅游,一不小心就中招,当地华人轻易不要搭讪中国女篮迎来坏消息!1主力球员遭到重伤,需要手术,恐赛季报销重阳节的九个小知识为何又叫登高节?手脚冰凉吃什么食物,这几类食物可以选择恭喜花滑女神李子君!嫁高富帅结婚半年喜当妈,曾与樊振东传绯闻2022年6月1日六一儿童节祝福语国乒男团打包顺走熊猫玩偶,马龙带头称不客气了,险摔倒吓到队友当家长的千万要注意!已有孩子受伤!这些偏方别用了北京有个小众又免费的地方,网红铁轨与秋色,够你摄影大半天了秋天,就得穿风衣,但要记住3穿3不穿,才更高级有气质食材有限,如何吃才能营养均衡?这份攻略请收下世界各地十大禁令排名第一的朝鲜最奇葩于谦郭德纲相爱相杀几十年,关系没我们想象的那么简单聆听大地的声音五年级日记《开甲壳虫车的女校长》读后感殡葬业生意经毛利率高企有墓型一年涨价2。2万相亲界的未解之谜172的男生和168的女生到底谁高?原来,我也有快乐山地越野赛存在的危险不完美的美发量多的女生适合什么发型层次感设计更轻盈时尚这些板块即将爆发!重点关注下了第一场雪小学生作文300字

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利