C++中的属性及其使用

Attributes in c++ and their use

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

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

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

但是属性很便宜;它们不与任何现有代码冲突。考虑要声明一个函数通常不会 return(即:总是抛出异常或调用 std::terminate 或其他)。该功能并不能真正控制程序的行为;它更像是 compiler/user 关于该函数将如何运行的指示器。因此,这不是一个值得打破恰好命名变量的人的代码的功能 noreturn.

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

另一个元问题属性解决的是“修复”一开始可能不是好主意的事情。例如,如果您没有明确 breakswitch 语句中的 case 标签会自动跳转到下一个标签。虽然失败行为很有用,但作为 默认值 是错误的行为,因为 90% 以上的时间,您打算 break.

但是您不能改变 case 标签的工作方式并引入 fallthrough 关键字。这会破坏已经使用隐式掉落行为的每个人的代码。

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

大多数 C++ 属性都是这样的:代码的标签太过 trivial/non-functional 以至于无法刻录关键字,或者向编译器指示一些对代码有用的东西,但实际上并不是语言的一部分。