我读到C ++ 11引入了属性的概念,例如[[noreturn]]
,它表示该函数不会返回给调用者。
[[noreturn]] void fun()
{
throw std::string("Error!!!");
}
void func()
{
fun();
}
void aTempFunc()
{
try
{
func();
}
catch (std::string &e)
{
std::cout << e << std::endl;
}
}
通过查看示例,读者可以理解该函数抛出异常并且调用将不会返回到func
函数。
我有点困惑,了解什么是C ++属性以及为什么需要它?程序员如何才能真正利用这些属性?
有人可以详细解释。如果我对属性的理解是错误的,请纠正我。 感谢。
答案 0 :(得分:4)
大多数属性是编译器提示,ABI规范或相对于目标对象格式的要求(可见性,部分等)。
因此,大多数属性都不会更改程序的可观察行为:如果删除源代码的所有属性,并且如果它编译,则可以合理地期望生成的程序表现为用属性编译的那个。
但也有一些属性可以显着影响程序的行为或可编译性,例如align
属性,即使它们没有大幅改变代码的语义。
实现可以提供自己的属性,只要程序的可观察行为遵循c ++语言,C++ standard [intro.compliance],这些属性就会产生任何后果:< / p>
符合条件的实现可能具有扩展(包括其他库函数),只要它们可用 不要改变任何格式良好的程序的行为。诊断程序需要实现 使用根据本文档格式不正确的扩展。但是,他们这样做了 编译并执行这些程序。
答案 1 :(得分:3)
属性由程序员放置,以获得编译器的好处。基本上,它们为编译器提供了更多信息,并允许更多优化。
例如,noreturn
属性允许编译器在调用函数之前回收堆栈内存(因为您不再需要堆栈帧)或者至少将调用后的代码视为死代码。