C++ 属性

17 Mar 2025 | 4 分钟阅读

在现代 C++ 语言中,我们拥有使用属性的功能,这可以提高代码效率并减少程序员编写大量代码的时间。C++ 中的属性就像与代码一起编写的一些附加条件,编译器必须遵循该特定条件。这些属性可以是附加到变量或函数的任何条件或任何信息。尽管编译器在优化方面非常有效,但与人类相比,它们在某些方面仍然有所欠缺,并推荐效率低下的通用代码。这主要是由于缺乏对人所面临的“问题”的理解而发生的。

C++ 标准包含了特定的新属性,这些属性允许对编译器进行少量额外规范,而不是实际的代码语句,以在一定程度上缓解此问题。

语法

C++ 代码中使用以下属性

1. noreturn 属性

此属性用在任何函数声明之前,此属性表示此函数永远不会返回任何值。由于我们有一个具有相同功能的 void 关键字,但主要区别在于 void 函数不返回任何值。但是,控制器会返回到函数调用处,而在 noreturn 属性中,控制器不会返回到函数被调用的位置。

C++ 示例

输出

Attributes in C++

说明

在上面的示例中,fxn1 的返回类型为 void,因此它不返回任何值,但在调用 fxn1 后,fxn2 将被调用,因为控制器将到达 fxn1 被调用的位置。

C++ 示例 2

输出

Attributes in C++

说明

在上面的代码中,如果我们在 fxn1 之前使用 noreturn 属性,那么我们将在编译器中看到有关该属性的警告。

2. maybe_unused 属性

当我们声明代码中的任何变量但未使用它时,此属性用于忽略编译器的警告。

C++ 示例

输出

Attributes in C++

说明

在上面的示例中,我们有一个未使用的变量 **"a"**。但是,编译器不会对此未使用的变量抛出任何错误或任何警告,因为我们在变量名之前使用了该属性。

3. nodiscard 属性

此属性用在任何函数之前,并且该函数的返回值不能被丢弃。

C++ 示例

输出

Attributes in C++

说明

在上面的示例中,我们从函数 f 返回值为 0,并将其存储在变量 x 中,因此我们使用了返回值,并且不会出现错误。

C++ 示例 2

输出

Attributes in C++

说明

在上面的代码中,我们丢弃了函数 f 的返回值,并且在函数之前使用了属性 nodiscard,因此它将抛出错误,指出我们不能丢弃变量的值。

4. likely 属性

此属性用于那些执行概率更高的条件语句。

C++ 示例

输出

Attributes in C++

标准属性和非标准属性之间的区别

  1. 在标准属性中,语法使用双大括号 [[...]],而在非标准属性中,我们可以以非标准方式编写属性,并且我们使用一些特定的关键字,如 declspec() 或 __attribute__。
  2. 在标准属性中,编译器不会给出警告或错误,并且代码变得非常可移植。在非标准属性中,代码也是可移植的,但编译器可能会发出警告或错误。
  3. 标准属性几乎存在于所有编译器中,而非标准属性通常只存在于特定编译器中。
  4. 标准属性不使用标准命名空间语法,而非标准属性使用标准命名空间语法。