加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c 11 – 使用[[noreturn]]以外的属性的建议?

发布时间:2020-12-16 06:57:27 所属栏目:百科 来源:网络整理
导读:来自关于在另一个 question中使用供应商特定属性的讨论,我问自己,“我们应该告诉人们使用未在标准中列出的属性的规则”? 定义的两个属性是[[noreturn]]和[[carry_dependencies]].该标准揭示了编译器应如何对未知属性做出反应 – 因此,按照标准,它们可能会因
来自关于在另一个 question中使用供应商特定属性的讨论,我问自己,“我们应该告诉人们使用未在标准中列出的属性的规则”?

定义的两个属性是[[noreturn]]和[[carry_dependencies]].该标准揭示了编译器应如何对未知属性做出反应 – 因此,按照标准,它们可能会因错误消息而停止.这不是例如GCC会这样做,它会发出警告并继续.这可能是最常见的编译器所期望的行为.出于这个原因,我想在标准中阅读“应该”,但我们没有.

论文N2553提出了灵活的属性.它列出了GCC使用的其他属性(
未使用的,弱的)和MSVC(dllimport).对于OpenMP,广泛支持的并行化框架,建议使用范围属性,例如. omp :: for(子句,子句),omp :: parallel(子句,子句).因此,我们很可能在支持语法之后很快就会出现一些特定于供应商的属性.

因此,当我们现在“走出世界”并告诉人们关于C 11时,关于使用属性的建议是什么?

>仅使用noreturn和carry_dependencies
>使用您的编译器旧语法,例如. __attribute __((noreturn))并在移植代码时定义宏(当前情况)
>使用您喜欢的编译器自由支持的那些属性,知道这些代码可能无法移植到另一个符合标准的编译器,因为如果标准允许编译器因错误而停止,则必须考虑这种情况.这听起来有点像提倡编写非可移植代码.
>或者,我的猜测,期望最常用的编译器警告未知属性,因此您可以使用特定于供应商的属性,请记住,在极少数情况下,您可能会遇到问题.

注意最后两个项目符号的细微差别.虽然两者都说“使用你需要的那些属性”,但item3的消息是“不关心其他编译器”,而item4隐含地将标准文本“实现定义的行为”改为“编译器应该发出诊断消息”.

对于即将到来的最佳实践,这可能是什么建议?

解决方法

最佳实践 – 唯一一个在实践中具有合理可移植性的实践,从不介意标准中的模糊性 – 是使用宏.在我们忘记不支持属性的编译器之前还需要很多年.

编译器的数量和这些编译器定义的自定义__keywords__的数量将一直在增加,并且语言定义一种包含损坏的方法是有意义的.它不需要彻底改变人们编写不可移植代码的方式,也不需要使不可移植代码可移植(尽管标准属性可以这样做).只需为咖啡因添加的编译器后端工程师提供一个沙箱,就可以在他们想要扩展语法时使用.

但是,有点令人担忧的是,除了当前标准的语言之外,没有为实现或语言保留任何属性令牌.因此,当他们决定将更多标准化时,会遇到麻烦.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读