一、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的话便还是会返回。