您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

《杂注(& quot一次& quot)vs包含警卫》” 《源代码交易》

  • 时间:2022-07-17 00:37 编辑: 来源: 阅读:296
  • 扫一扫,手机访问
摘要:《杂注(& quot一次& quot)vs包含警卫》” 《源代码交易》
我写的问题参考:标题:考虑把include guards改为pragma一次。我们可以使用_ pragma指令来保护头文件。示例:# ifndef FOO _ BAR _ baz _ H _ # define FOO _ BAR _ BAZ _ H _...# endif//FOO _ BAR _ BAZ _ H _ change to _ Pragma(" once ")有几个因素支持小写文件/目录名。可移植性不会出现跨平台问题,编译器实现标准,它们会支持它。可读取性一般来说,如果你只是想做一些防范,你不应该关心这个文件的名称和目录。守卫的命名是另一个大问题,不规范的事情总是以打架告终。粘贴_Pragma("once "),这里和那里。计算机行业制定了标准,我们公司也是如此。请随意参考腾讯cplusplus代码标准“2.2。[必需的]头文件保护“:https://git.code.oa.com/standards/CPP # 22% E5 % BF % 85% E9 % A1 % BB-% E5 % A4 % B4 % E6 % 96% 87% E4 % BB % B6 _ Pragma指令是c++中的标准级别,而不是像gcc的# pragma那样的特定编译器扩展,它最大化了稳定性和兼容性 简单来说,#pragma用于向编译器传递语言标准之外的少量信息。 举个简单的例子,如果我们在代码的头文件中定义下面的语句:#pragma一次,要达到和前面例子#pragma类似的效果,我们只需要下面的代码。 _ Pragma(" once ");与前解指令#pragma相比,因为_Pragma是一个运算符,所以可以嵌套在一个宏中。 我们可以看一下下面的例子:# define concat(x)pragma(concat on # x)# define pragma(x)_ pragma(# x)concat(..\ concat.dir)。这里,CONCAT(..concat.dir)最终会产生_ pragma (concat on "..串联。 但是#pragma不能用宏开发,所以从灵活性上来说,standard _Pragma更灵活。 注意为什么强调“标准”。我的意思是_ Pragma(“once”)而不是#pragma once。可见_ Pragma(“once”)在可移植性、可读性、方便性、规范性等方面是有优势的。 使用新标准可以提高开发效率,用最自然的思维方式和最简单的代码表达很多内容。 因为前者是语言层面的标准,后者是编译器的扩展,所以在标准传递_Pragma运算符之前,GCC可能已经实现了#pragma。这个时候windows和macOS系统的编译器可能不知道#pragma,可能是另一个foo,bar 但是,标准被采用后,所有的编译器都将遵循该标准。 因此,使用标准将是最常见的方式,也是我们的方式。 详见n 3690 . pdf:http://www . open-STD . org/JT C1/sc22/wg21/docs/papers/2013/n 3690 . pdf image.png。但是有一种观点认为不应该使用_ Pragma(“once”),因为编译器的实现存在bug。 (https://stack overflow . com/questions/1143936/pragma-once-vs-include-guards)我们建立了一个标准来提高开发效率,同时还要确认这个标准是否稳定可用。为了防止引入未知问题, 网上资料不多,直接看了内核和编译器的实现。 早期的问题有,比如foo . h-->:/path/to/foo . h链接共享同一个inode,使得编译器无法区分。 (详见附录“内核实现分析”。)关于问题的上下游,有一些事实如下:在编译器层面,gcc已经在3.4.0版本中修复了上述问题。 (详见附录“编译器实现分析”)在开发者层面,大部分项目不会出现上述问题。 这使我们相信标准及其实现。 极端的话,就算编译器还有这个所谓的bug,我们故意触发了,会不会有很严重的问题?答案可能是否定的 因为它和ifndef引起的宏冲突问题是一个级别的,而且在最早的编译阶段更容易被发现。 换句话说,既然可以接受ifndef,为什么不能接受_Pragma("once ")?即使在最邪恶的情况下,后者也不可能比前者犯更多的错误。 结论:我们可以使用standard _Pragma运算符 大家都把这个结论当成了我们的共识。 已在代码规范中升级。 具体编码可以直接按照规范:如果有ifndef头文件保护,请替换如下:change # IFNDEF FOO _ bar _ baz _ h _ # define FOO _ bar _ baz _ h _...# endif//foo _ bar _ baz _ h _ into _ Pragma(" once ")。请直接用_Pragma("once ")附上内核实现分析(Linux-5 . 7 . 0):image.png编译器实现分析(GCC-9 . 2 . 0):image.png


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部