游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

超酷的C语言

  C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非常简单,并且仍然有一些非常有用的语法技巧和功能,只是没有多少人知道罢了。
  一、指定的初始化
  很多人都知道像这样来静态地初始化数组:intfibs〔〕{1,1,2,3,5};
  C99标准实际上支持一种更为直观简单的方式来初始化各种不同的集合类数据(如:结构体,联合体和数组)。
  二、数组
  我们可以指定数组的元素来进行初始化。这非常有用,特别是当我们需要根据一组define来保持某种映射关系的同步更新时。来看看一组错误码的定义,如:
  Entriesmaynotcorrespondtoactualnumbers。Someentriesomitted。defineEINVAL1defineENOMEM2defineEFAULT3。。。defineE2BIG7defineEBUSY8。。。defineECHILD12。。。
  现在,假设我们想为每个错误码提供一个错误描述的字符串。为了确保数组保持了最新的定义,无论头文件做了任何修改或增补,我们都可以用这个数组指定的语法。charerrstrings〔〕{〔0〕Success,〔EINVAL〕Invalidargument,〔ENOMEM〕Notenoughmemory,〔EFAULT〕Badaddress,。。。〔E2BIG〕Argumentlisttoolong,〔EBUSY〕Deviceorresourcebusy,。。。〔ECHILD〕Nochildprocesses。。。};
  这样就可以静态分配足够的空间,且保证最大的索引是合法的,同时将特殊的索引初始化为指定的值,并将剩下的索引初始化为0。
  三、结构体与联合体
  用结构体与联合体的字段名称来初始化数据是非常有用的。假设我们定义:structpoint{intx;inty;intz;}
  然后我们这样初始化structpoint:structpointp{。x3,。y4,。z5};
  当我们不想将所有字段都初始化为0时,这种作法可以很容易的在编译时就生成结构体,而不需要专门调用一个初始化函数。
  对联合体来说,我们可以使用相同的办法,只是我们只用初始化一个字段。
  四、宏列表
  C中的一个惯用方法,是说有一个已命名的实体列表,需要为它们中的每一个建立函数,将它们中的每一个初始化,并在不同的代码模块中扩展它们的名字。这在Mozilla的源码中经常用到,我就是在那时学到这个技巧的。例如,在我去年夏天工作的那个项目中,我们有一个针对每个命令进行标记的宏列表。其工作方式如下:
  defineFLAGLIST()(InWorklist)(EmittedAtUses)(LoopInvariant)(Commutative)(Movable)(Lowered)(Guard)
  它定义了一个FLAGLIST宏,这个宏有一个参数称之为,这个参数本身是一个宏,它能够调用列表中的每个参数。举一个实际使用的例子可能更能直观地说明问题。假设我们定义了一个宏DEFINEFLAG,如:
  defineDEFINEFLAG(flag)flag,enumFlag{None0,FLAGLIST(DEFINEFLAG)Total};undefDEFINEFLAG
  对FLAGLIST(DEFINEFLAG)做扩展能够得到如下代码:
  enumFlag{None0,DEFINEFLAG(InWorklist)DEFINEFLAG(EmittedAtUses)DEFINEFLAG(LoopInvariant)DEFINEFLAG(Commutative)DEFINEFLAG(Movable)DEFINEFLAG(Lowered)DEFINEFLAG(Guard)Total};
  接着,对每个参数都扩展DEFINEFLAG宏,这样我们就得到了enum如下:enumFlag{None0,InWorklist,EmittedAtUses,LoopInvariant,Commutative,Movable,Lowered,Guard,Total};
  接着,我们可能要定义一些访问函数,这样才能更好的使用flag列表:
  defineFLAGACCESSOR(flag)boolisflag()const{returnhasFlags(1flag);}voidsetflag(){JSASSERT(!hasFlags(1flag));setFlags(1flag);}voidsetNotflag(){JSASSERT(hasFlags(1flag));removeFlags(1flag);}FLAGLIST(FLAGACCESSOR)undefFLAGACCESSOR
  一步步的展示其过程是非常有启发性的,如果对它的使用还有不解,可以花一些时间在gccE上。
  五、编译时断言
  这其实是使用C语言的宏来实现的非常有创意的一个功能。有些时候,特别是在进行内核编程时,在编译时就能够进行条件检查的断言,而不是在运行时进行,这非常有用。不幸的是,C99标准还不支持任何编译时的断言。
  但是,我们可以利用预处理来生成代码,这些代码只有在某些条件成立时才会通过编译(最好是那种不做实际功能的命令)。有各种各样不同的方式都可以做到这一点,通常都是建立一个大小为负的数组或结构体。最常用的方式如下:Forceacompilationerrorifconditionisfalse,butalsoproducearesult(ofvalue0andtypesizet),soitcanbeusede。g。inastructureinitializer(orwhereverelsecommaexpressionsarentpermitted)。LinuxcallstheseBUILDBUGONZERONULL,whichisrathermisleading。defineSTATICZEROASSERT(condition)(sizeof(struct{int:!(condition);}))defineSTATICNULLASSERT(condition)((void)STATICZEROASSERT(condition))ForceacompilationerrorifconditionisfalsedefineSTATICASSERT(condition)((void)STATICZEROASSERT(condition))
  如果(condition)计算结果为一个非零值(即C中的真值),即!(condition)为零值,那么代码将能顺利地编译,并生成一个大小为零的结构体。如果(condition)结果为0(在C真为假),那么在试图生成一个负大小的结构体时,就会产生编译错误。
  它的使用非常简单,如果任何某假设条件能够静态地检查,那么它就可以在编译时断言。例如,在上面提到的标志列表中,标志集合的类型为uint32t,所以,我们可以做以下断言:STATICASSERT(Total32)
  它扩展为:
  (void)sizeof(struct{int:!(Total32)})
  现在,假设Total32。那么!(Total32)等于0,所以这行代码相当于:
  (void)sizeof(struct{int:0})
  这是一个合法的C代码。现在假设标志不止32个,那么!(Total32)等于1,所以这时代码就相当于:
  (void)sizeof(struct{int:1})
  因为位宽为负,所以可以确定,如果标志的数量超过了我们指派的空间,那么编译将会失败。

戴耳机耳朵不舒服?骨传导耳机才是最佳选择想必大家对于骨传导耳机还是比较陌生的,它和日常生活中佩戴耳机有所不同,传统耳机通过空气振动鼓膜来传播声音,而骨传导耳机则通过颅骨震动直接传至大脑听觉神经,对于用户听觉有更好的保……数字农业将迎来难得的发展机遇,进军农业新风口在全球新一轮的科技革命、产业变革中,我国农业也正在物联网、智联网、大数据、云计算等新一代信息技术上加快发展应用,这些应用正在深刻改变着我们的农业生产生活方式,引发了农业经济和产……超时空同居谷小焦为何没有认出陆鸣谷小焦出陆鸣结局超时空同居谷小焦为何没有认出陆鸣:谷小焦出陆鸣结局电影《超时空同居》正在热映,对于这部电影也得到了许多人的关注和好评。而在《超时空同居》的结局中,谷小焦不仅没和陆鸣在一起……闭着眼都能选的手机,目前这4部手机最值得考虑,你会怎么选?闭着眼都能选的手机,目前这4部手机最值得考虑,你会怎么选?第一部:小米MIX4新发布的小米MIX4手机,你们看了没有?不得不说还是非常惊艳的,有两点让我也无法抗拒。……十年一品温如言什么时候上映,十年一品温如言演员表十年一品温如言说出来很多人不清楚,可十年一品温如言电影是什么时候上映,很多网友就想去了解一下有关的故事,看十年一品温如言提早把海报和预告公布,来让观众熟悉剧情,但有的网友就不清……平凡的荣耀结局如何,平凡的荣耀郝帅第几集出场职场剧《平凡的荣耀》给带来万年不升职的投资公司经理吴恪之跟初入职场的新晋菜鸟孙弈秋一起在金融投资领域奋斗,期间有郝帅在第5集出场把事情变得有意思,直到最后吴恪之和安芊翊喜结连理……少年游之一寸相思沈曼青谁演的沈曼青的感情线及结局大起底近段时间以来,电视剧《少年游之一寸相思》正在热播当中,剧中沈曼青的扮演者备受大家的关注,沈曼青这个角色是谁演的?沈曼青这个角色在剧中的感情线是怎么样的?以及大结局是如何的?一起……互联网监管或再度升级,快手还能获得老铁们的666吗?8月13日,有关针对直播乱象提出对网络三俗要零容忍一文经媒体发布后引发社会巨大反响,文中表示,对于互联网可能危害未成年人的网络内容必须零容忍,绝不能让网络三俗的不良信息影响孩子……韩国校园电影2018让人期待的14部韩国电影2018年最让人期待的韩国校园电影《与神同行2》预计将于2018年上映,再度引爆韩国电影票房。《釜山行》导演延尚昊的新作《念力》,预计2月上映。这次不再玩丧尸片,而……外滩钟声结局怎样,外滩钟声结局余佩佩年代剧《外滩钟声》包含许多爱情和亲情,加上时代冷暖的情况,更让观众能感受原来老时代产生的爱情,不过给展现结局十分完,并有美杜心生和苗招娣走到一起,而俞佩佩最后选择出国留学了。1……诺基亚亮剑,6100mAh4K屏100倍变焦,实力堪比国产诺基亚可是陪伴80后甚至90后青春的老品牌,它曾经也是全球第一大手机厂商,也是有着辉煌时刻的。但随着苹果、三星等智能手机的到来,一个称霸全球手机市场15年的王者就开始走向没落了……GalaxyWatch4体检功能,官网警告这几类人避免使用有留意昨晚三星发布会的网友,相信已经知道GalaxyWatch4和GalaxyWatch4Classic配备了全新BioActive生物活动感应器,只要用两只手指按住表侧的按钮……
百元能买到哪些数码好物?双十一首推这四款到手价不超过600元自2009年第一届双十一狂欢节以来,每年的11月11日便成了用户剁手的时刻。而到了今年,双十一预售活动更是从10月份就已陆续开始,截至目前已有众多品牌推出了满减、折扣等活动。那……奔腾年代白曼宁和周铁锤离婚了吗白曼宁和周铁锤结局是什么电视剧《奔腾年代》正在热播中,这部电视剧刚一开播就引起了很多人的关注,里面的剧情也是百转千折,其中白曼宁和周铁锤的关系就很受关注,白曼宁和周铁锤离婚了吗?白曼宁和周铁锤结局是什……奔腾年代是真实存在的故事吗常汉卿和金灿烂的结局是什么最近,电视剧《奔腾年代》正在热播中,不少网友比较好奇,这部电视剧是真实的故事吗?最后,常汉卿和金灿烂的结局是什么呢?今天,小编就为大家来剧透一下。奔腾年代是真实存在的故事……极限17羽你同行小娜爷爷是谁扮演的小娜爷爷最后的结局是怎么样极限17羽你同行昨天已经在腾讯视频、芒果TV播了,看过这部剧的网友们一定看到了一张很熟悉的面孔,那就是小娜的爷爷,那么小娜的爷爷到底是谁扮演的呢?小娜爷爷最后的结局又是什么呢?……京东数科产业AI公开课未来三到五年将是AI产业的窗口机遇期当无接触开始成为疫情中的现实需求,AI这个曾经引发过数次热潮的产业从幕后走向前台,逐渐成为人们视线的焦点。未来AI与产业的关系将如何发展?学术界和产业界对此又有何看法?2……极限17羽你同行什么时候播极限17内容和演员阵容大公布极限17羽你同行这部电视剧还没有开始播,就已经受到了的广大网友的关注。这部剧主演是《创造101》中出道女团的团员杨超越主演的,就算是不介绍杨超越是《创造101》出道的,相信大家……代账会计,最终将自己带入监狱小晴大学毕业后一边打工,一边参加自学考试,取得大学本科学历,自主创业,带领一班年轻人开展业务。先后为20多家公司提供专业财会代账业务。2018年初,偶然,认识了贾某。贾某……盘点影视剧里的经典台词,哪句让你印象深刻盘点影视剧里的经典台词,哪句让你印象深刻人生那个东西,也许只是在一段刻骨铭心之后才算是真正的开始,但有时候想想,徒留遗憾罢了。《好想好想谈恋爱》:承诺是男人给女人的……小Q票房破亿怎么回事电影小Q讲述了什么感人故事近日,官方数据透露,小Q票房破亿了,猫眼电影数据显示,到9月28日下午四点为止票房为1。02亿,这部电影讲述了什么故事,据网友透露剧情非常感人!小Q票房破亿《小Q》……使用该微信插件的赶紧卸载,腾讯开始大规模封号你期望微信有什么功能?单向好友检测首当其冲,其次有自动回复、朋友圈再次编辑、已读功能等等等等这些都老生长谈了,每次微信更新都有人提到。当然还有一些明知道微信不……漫威电影全系列顺序漫威电影这样看剧情一目了然漫威电影全系列顺序,漫威电影正确观看顺序列表分享。许多小伙伴在看某部漫威电影的时候,因为没有看前面的电影,总有种摸不清剧情的感觉,经常有人问漫威电影官方观看顺序。还有一些人以为……iQOOZ3体验评测升杯升配,重构千元机对于旗舰手机来说快充、性能、高刷是一个都不能少,但对于千元机来说,我们的选择标准却没有那么苛刻,有的时候往往能满足其一就已经很不错了,甚至谈不上机身的设计。但对于iQOO……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网