c++新属性 [[noreturn]]

本文介绍了C++中的属性特性,特别是[[noreturn]]属性的使用,它用于标记函数不会返回。[[noreturn]]属性在代码优化和阅读理解上起到重要作用,但不会强制阻止函数执行后代码的运行。通过示例,阐述了如何正确使用[[noreturn]]以及误用可能导致的警告和中断情况。强调了理解和正确应用[[noreturn]]对于代码质量和编译器优化的重要性。
摘要由CSDN通过智能技术生成

一、c++扩展属性

属性在c++中被用来对函数、变量等其他类型进行特殊说明,有助于进行编译器对所编写的代码进行自适应优化。其书写位置相对灵活,但不同的书写位置也会影响它的作用意义。格式如下所示:

[[ 属性1 ]]  class A   [[ 属性2 ]]  {}  [[ 属性3 ]] B [[ 属性4 ]], D;

  • 书写在属性1位置,作用意义为Class A的实体定义。
  • 书写在属性2位置,作用意义为Class A的定义。
  • 书写在属性3位置,作用意义为类型B。
  • 书写在属性4位置,作用意义为实体B。

[[ noreturn ]]主要用来标志当前函数不会返回,需要注意的是其更大的意义在于标注,表明在当前函数调用之后的函数或代码并不会被执行。在调试过程中并没有发现其有强制限制,例如某个函数加上该属性标注后便不会返回(即使其有返回值),其更多的是给编写者在阅读时的一种直观上的理解(即该函数之后的函数和代码不会被执行,该处便为调用该函数的函数的最后执行尽头了),除此之外也可以告知编译器如何进行代码优化的处理,例如无用代码删除等操作。

void func1()
{
    cout<<"this is func1"<<endl;
}

void func2()
{
    cout<<"this is func2"<<endl;
}

//使用[[noreturn]]属性标注TODO函数
[[noreturn] void todo()
{
    throw "error";
}

int main()
{
    func1();//可以执行
    todo();
    func2;  //不会被执行
    return 0;
}

给人更多的是阅读上的直观理解吧。这个地方有一个烧脑的点就是返回值为void类型的函数并不是代表着其就是不会返回,void函数与int、char等函数其实本质来讲都是调用函数,被调用后都会被返回至之前程序计数器记录到的地址继续执行,只不过是void函数没有返回值而已,换而言之void函数是无返回值但会返回,所以在使用[[ noreturn ]] 属性时应当确保当前函数一定不会返回。可以看下下面的例子:

[[noreturn]] void Func1(int i)
{
    if(i > 5)
    {
        throw "error";
    }
}

int main()
{
    Func(3);
    cout<<"end"<<endl;
    return 0;
}

这个时候编译的时候会有警告,执行的话也会有中断提示,原因就是在上面的例子中如果 i <= 5的话便还是会返回。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值