在讨论在另一个question中使用特定于供应商的属性时,我问自己,“我们应该告诉人们使用标准中没有列出的属性的规则是什么”
定义的两个属性是[[ noreturn ]]和[[ carries_dependencies ]]。标准留下了编译器应该如何对未知属性作出反应的问题--因此,按照标准,编译器可能会以错误消息停止。这不是GCC所做的,而是发出警告并继续下去。这可能是最常见的编译器所期望的行为。出于这个原因,我想在标准中读一个“应该”,但我们没有它。
论文N2553提出了柔性属性。它列出GCC ( unused,weak)和MSVC (dllimport)使用的其他属性。对于OpenMP,广泛支持的并行化框架、作用域属性被建议,例如。omp::for(clause, clause),omp::parallel(clause,clause).因此,我们很可能在某些特定于供应商的属性支持语法之后很快就会使用它们。
因此,当我们现在“出去”并告诉人们关于的事情时,关于使用属性的建议应该是什么呢?
noreturn和编译器,而不是旧语法,例如。在您移植代码时,定义一个宏(当前的situation)注意最后两个项目中的细微差别。虽然两者都说“使用所需的属性”,但第3条的信息是“不关心其他编译器”,而item4则将标准文本“实现定义的行为”隐式地重新表述为“编译器应该发出诊断消息”。
,对于即将到来的最佳实践,有什么建议?
发布于 2011-09-17 05:42:51
最佳实践是使用宏,这是唯一一个在实际条件下可以合理移植的方法,更不用说标准中的模棱两可。很多年后,我们才会忘记不支持属性的编译器。
编译器的数量和这些编译器定义的自定义__keywords__的数量都会不断增加,因此语言定义一种控制损害的方法是有意义的。它不需要彻底改变人们编写不可移植代码的方式,也不需要使不可移植代码可移植(尽管标准属性会这样做)。只要给咖啡因的编译器后端工程师一个沙箱,当他们想要扩展语法的时候,就有一个好处。
不过,除了当前标准的属性标记之外,没有任何属性标记保留给实现或语言,这有点令人担忧。因此,当他们决定更多的标准化时,将会有麻烦。
https://stackoverflow.com/questions/7441951
复制相似问题