C++ 属性
在现代C++语言中,我们可以使用属性来增加代码的效率,减少程序员编写大量代码所需的时间。C++中的属性就像是与代码一起编写的一些额外条件,编译器必须遵循该特定条件。这些属性可以是附加到变量或函数的任何条件或信息。尽管编译器在优化方面相当有效,但与人类相比,在几个方面仍然存在不足,并推荐使用效率低下的通用代码。主要原因是对人所面临的“问题”缺乏理解。
C++标准已经包含了特定的新属性,可以使编译器在一定程度上解决这个问题,而不是实际的代码语句。
语法:
[[attribute_list]]
以下是C++代码中使用的属性:
1. noreturn属性
该属性用于任何函数声明之前,表示该函数永远不会返回任何值。虽然我们有一个void关键字,它可以实现相同的功能,但关键区别在于void函数不返回任何值,但控制器会返回到函数调用的地方,而noreturn属性不会返回到函数被调用的地方。
C++示例:
#include
#include
using namespace std;
void fxn1()
{
cout<<"fxn1 is called"<
输出:
解释:
在上面的例子中,fxn1具有void返回类型,因此它不返回任何值,但在调用fxn1之后,fxn2将被调用,因为控制器将达到调用fxn1的点。
C++示例2:
#include
#include
using namespace std;
[[noreturn]] void fxn1()
{
cout<<"fxn1 is called"<
输出:
说明:
在上述代码中,如果我们在fxn1之前使用noreturn属性,则编译器会显示有关该属性的警告。
2. maybe_unused属性
当我们在代码中声明变量但不使用时,可以使用此属性来忽略编译器的警告。
C++示例:
#include
#include
using namespace std;
int main()
{
[[maybe_unused]] int a=54;
cout<<"hello world";
}
输出:
说明:
在上面的示例中,我们有一个未使用的变量 “a” 。尽管如此,编译器不会抛出关于此未使用变量的任何错误或警告,因为我们在变量名之前使用了属性。
3. nodiscard属性
此属性用于任何函数之前,该函数的返回值不能被丢弃。
C++示例:
#include
#include
using namespace std;
[[nodiscard]] int f()
{
return 0;
}
int main()
{
int x=1;
x=f();
cout<
输出:
解释:
在上面的示例中,我们从函数f中获得的返回值为0,并将其存储在变量x中,因此我们利用了返回值,并且不会出现错误。
C++示例2:
#include
#include
using namespace std;
[[nodiscard]] int f()
{
return 0;
}
int main()
{
int x=1;
f();
cout<
输出:
解释:
在上面的代码中,我们丢弃了函数f的返回值,并且在函数之前使用了nodiscard属性,因此会抛出一个错误,表示我们不能丢弃变量的值。
4. likely属性
这个属性用于那些有更高概率执行的条件语句之前。
C++示例:
#include
using namespace std;
int f(int i)
{
switch (i) {
case 1:
[[fallthrough]];
[[likely]] case 2 : return 1;
}
return 2;
}
int main(){
cout<
输出:
标准属性与非标准属性的区别
- 在标准属性中,语法使用双大括号[[…]],而在非标准属性中,我们可以以非标准的方式编写属性,并使用一些特定的关键字如declspec() 或 attribute。
- 在标准属性中,编译器不会给出警告或错误,并且代码非常具有移植性。在非标准属性中,代码也具有移植性,但可能会被编译器给出警告或错误。
- 标准属性几乎存在于所有的编译器中,而非标准属性通常只存在于特定的编译器中。
- 标准属性不使用标准的命名空间语法,而非标准属性使用标准的命名空间语法。