C++中的属性及其使用

Mat*_*ara 3 c++ attributes

我发现的最新 C++ 功能(也很现代)是属性。它们对于向编译器发出信号似乎非常有用,但除此之外,属性还有哪些其他更具体的用途?如何创建和使用自定义属性以及使用 C++ 属性背后的主要思想是什么?如果主题太宽泛,我对带有函数的属性特别感兴趣。我所说的属性是指:https ://en.cppreference.com/w/cpp/language/attributes

Nic*_*las 9

属性(即作为 C++ 语言的功能的属性,而不是特定于编译器的__declspec属性__attribute__)是一种 C++ hack。它们是随着 C++ 语言的发展而出现的元问题的解决方案。

例如,关键词。那里有大量的 C++ 代码,任何添加新关键字的语言新版本都需要避免破坏任何可能使用该关键字作为标识符的代码。因此,任何可能想要明确说明某些内容的语言功能都需要通过标准化。也就是说,它最好是值得的。

但属性很便宜;它们不与任何现有代码冲突。考虑想要声明一个函数不正常返回(即:总是抛出异常或调用std::terminate或其他什么)。该功能并不能真正控制程序的行为;它更多地是向编译器/用户指示该函数将如何运行的指示器。因此,对于恰好命名了变量的人来说,这个功能不值得破坏其代码noreturn

但您可以拥有该[[noreturn]]属性,因为这不会破坏任何人的代码。

解决的另一个元问题属性是“修复”原本可能不是好主意的事情。例如,如果您不明确声明,语句case中的标签switch会自动跳转到下一个标签break。虽然失败行为很有用,但将其作为默认行为是错误的,因为 90% 以上的情况下,您是打算这么做的break

但你不能去改变case标签的工作方式并引入fallthrough关键字。这将破坏已经使用隐式失败行为的每个人的代码。

但您可以添加一个[[fallthrough]]属性。它在语言中没有任何意义,但是如果编译器看到它,那么它就可以知道您打算跳到下一个标签。此外,您现在可以打开有关失败行为的编译器警告,以便在没有该属性的情况下发生的任何失败[[fallthrough]]都会向您发出警告。您甚至可以选择将该警告设置为错误,从而有效地“修复”该语言。为你。

大多数 C++ 属性都是这样的:代码的标签太琐碎/无功能,以至于不需要为其刻录关键字,或者向编译器指示一些关于代码的有用信息,但实际上并不是语言的一部分。