C++11 使用[[noreturn]]以外属性的建议?

C++11 使用[[noreturn]]以外属性的建议?,c++11,attributes,custom-attributes,C++11,Attributes,Custom Attributes,在另一篇文章中讨论了供应商特定属性的使用,我问自己,“对于使用标准中未列出的属性,我们应该告诉人们什么规则” 定义的两个属性是[[noreturn]]和[[carriers\u dependencies]]]。该标准为编译器在未知属性上的反应留下了空白——因此,根据该标准,编译器可能会在出现错误消息时停止。这不是GCC所做的,它发出警告并继续。这可能是最常见的编译器所期望的行为。出于这个原因,我想在标准中读一个“应该”,但我们没有 N2553提出了柔性属性。它列出了GCC使用的其他属性( 未使用

在另一篇文章中讨论了供应商特定属性的使用,我问自己,“对于使用标准中未列出的属性,我们应该告诉人们什么规则”

定义的两个属性是
[[noreturn]]
[[carriers\u dependencies]]]
。该标准为编译器在未知属性上的反应留下了空白——因此,根据该标准,编译器可能会在出现错误消息时停止。这不是GCC所做的,它发出警告并继续。这可能是最常见的编译器所期望的行为。出于这个原因,我想在标准中读一个“应该”,但我们没有

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

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

  • 仅使用
    noreturn
    携带依赖项
  • 改用编译器的旧语法,例如,
    \uuuuuu属性(noreturn))
    并在移植代码时定义宏(当前情况)
  • 使用您最喜爱的编译器支持的属性,知道此代码可能不可移植到另一个标准一致编译器,因为如果该标准允许编译器停止错误,则必须考虑这将发生。这听起来有点像是提倡编写不可移植的代码
  • 或者,我猜,最常用的编译器会对未知属性发出警告,因此您可以使用特定于供应商的属性,记住在极少数情况下您可能会遇到问题
注意最后两个项目符号中的细微差别。虽然两者都说“使用您需要的那些属性”,但item3的消息是“不关心其他编译器”,而item4则含蓄地将标准文本“实现定义的行为”改为“编译器应发出诊断消息”


对于即将推出的最佳实践有什么建议?

最佳实践是使用宏,这是唯一一种在实践中可以合理移植的实践,更不用说标准中的模糊性了。我们还需要很多年才能忘记不支持属性的编译器

编译器的数量以及由这些编译器定义的自定义
\uuuuuuu关键字的数量将一直在增加,而语言定义一种控制损害的方法是有意义的。它不需要彻底改变人们编写不可移植代码的方式,也不需要使不可移植代码可移植(尽管标准属性可以做到这一点)。当编译器后端工程师想要扩展语法时,简单地给他们一个沙箱是有好处的


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

这个问题纯粹是推测性的。它是关于一个几乎没有实现的特性,询问人们可能希望如何在尚未实现它的编译器中查看它。任何回答都没有实际的事实依据;任何答案都只是猜测,我不同意。我问标准设计者的意图和作为即将到来的标准大使的指导。@towi:你问的是如何应对各种实现。这些实现并不存在。