函数的属性是什么意思

What is meant by an attribute of a function?

本文关键字:意思 是什么 属性 函数      更新时间:2023-10-16

c++ 11语法是什么意思?

[[ noreturn ]] void f () {
    throw "error";
}

c++标准工作草案n3797规定,

函数的第一个声明必须指定noreturn属性,如果该函数的任何声明指定了noreturn属性。中的noreturn属性声明函数声明一个翻译单元和同一个函数,但不使用在另一个翻译单元中Noreturn属性,则程序是不规范的;不需要诊断。

函数的属性是什么意思?

函数由其名称、返回类型、形式参数列表及其类型定义。这些项构成了函数的"接口":它们对函数的调用者很重要,因为它们定义了调用函数的方式。

另一方面,

属性提供了一种方法,告诉编译器关于函数的额外信息,这些信息不会改变函数的接口。当编译器知道函数是

    中断处理程序,或
  • 纯函数(即没有副作用或引用任何类型的状态),或
  • 返回两次的函数(类似于fork),或者
  • 一个永远不会返回等的函数

编译器可以更好地优化代码,并提供额外的警告/屏蔽不必要的警告。

例如,如果你写

main() {
    f();
    g();
}

如果f()被标记为noreturn,编译器将发出g()不可达的警告。

属性是c++ 11中的一个新特性。编译器供应商长期以来一直提供特定于供应商的扩展,允许您以某种方式注释函数,但现在有了一种标准机制。标准没有指定很多实际属性(只有noreturncarries_dependency),但是用于注释函数的机制现在至少是标准化了。

也就是说,noreturn属性具有重要的语义:如果用该属性声明的函数确实返回,则程序具有未定义的行为。如果编译器知道你正在从一个noreturn函数返回,那么它们应该(但不是必须)产生一个诊断。该属性对于优化和更好的诊断是有价值的。

[[noreturn]]属性为静默警告。

#include <stdexcept>
[[noreturn]] void report_error()
{
    throw std::runtime_error("error");
}
int f(int x)
{
    if (x > 0) {
        return x;
    }
    report_error();
}
int main()
{
    f(1);
}

如果不使用[[noreturn]],编译器在f(): warning: control may reach end of non-void function中输出警告。

来自GCC的文档"noreturn关键字告诉编译器假定函数不能返回。然后,它可以进行优化,而不必考虑如果致命的情况再次发生会发生什么。这使得代码稍微好一些。更重要的是,它有助于避免对未初始化变量的虚假警告。"