RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 662431
Accepted
αλεχολυτ
αλεχολυτ
Asked:2020-05-05 22:49:33 +0000 UTC2020-05-05 22:49:33 +0000 UTC 2020-05-05 22:49:33 +0000 UTC

C++中的属性是什么?

  • 772

自从c++11标准以来,语言中出现了所谓的“属性”,它们是什么以及为什么需要它们?

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    αλεχολυτ
    2020-05-05T22:49:33Z2020-05-05T22:49:33Z

    属性允许您为各种语言结构指定附加信息,例如类型、变量、名称、块和翻译单元。特别是,编译器可以使用此信息来生成更高效的代码,并在特定代码段级别向用户提供(反之亦然,抑制)警告消息,而不是整个程序或编译文件,如所提供的那样通过编译开关。

    属性出现在c++11中,此后有所扩展。当前存在以下标准属性:

    • carries_dependency
    • deprecated
    • fallthrough
    • likely和unlikely
    • maybe_unused
    • nodiscard
    • noreturn
    • no_unique_address

    编译器的每个特定实现都可以扩展属性集,在这种情况下,将单独描述其行为。未知属性将被忽略,但可能会显示一条警告消息。

    该属性始终用双方括号括起来:

    [[атрибут]]
    

    让我们按顺序进行:

    [[carries_dependency]]

    此属性不会改变程序的含义,但可能会导致更高效的代码生成。该属性既可以应用于整个函数,也可以应用于它的参数。当在计算线程之间传递值时,它在具有弱有序体系结构的系统上很有用。最难理解的属性 :) 因此,有关enSO的更多信息。

    [[deprecated]]

    允许您将实体标记为已弃用或不安全,但仍允许使用。可以应用于类声明、typedef 名称、变量、非静态数据成员、函数、命名空间、枚举、枚举成员或模板特化。该属性可以提供一个由字符串文字给出的参数。例如:

    [[deprecated("используйте функцию g()")]]
    void f();
    

    当显示适当的警报时,文本消息将用作提示。

    [[fallthrough]]

    此属性适用于空操作,即 ;. 它只能在内部switch用于通知编译器关于程序员设想的从一个分支case到另一个分支的动作链的“失败”。case如果在标签之间找不到语句,该属性允许您禁止编译器警告它可能发出的警告break。通常,缺席break可能是由于注意力不集中而引起的平庸错误。例子:

    switch (i)
    {
        case 1:
           ... 
           [[fallthrough]]; 
        case 2:
           ...
    }
    

    [[likely]]和[[unlikely]]

    可以将属性添加到标签case或语句(statement )中,以向编译器暗示一段特定的代码在程序执行时预计最有可能(likely),或者相反,不太可能(unlikely )。例子:

    void g(int);
    int f(int n) {
      if (n > 5) [[unlikely]] {     // n > 5 маловероятная ветка
        g(0);
        return n * 2 + 1;
      }
    
      switch (n) {
      case 1:
        g(1);
        [[fallthrough]];
    
      [[likely]] case 2:            // n == 2 более вероятное значение
        g(2);                       // нежели любое другое n
        break;
      }
      return 3;
    }
    

    [[maybe_unused]]

    用于通知编译器某个实体可能不会在程序中使用,并且应该抑制相应的警告。可以应用于类声明、typedef 名称、变量、非静态数据成员、函数、命名空间、枚举或枚举成员。如果您有在发布模式下构建时不会包含在二进制文件中的调试代码,则该属性会很有用。例子:

    [[maybe_unused]] void f([[maybe_unused]] bool thing1,
                            [[maybe_unused]] bool thing2) {
      [[maybe_unused]] bool b = thing1 && thing2;
      assert(b);
    }
    

    以前,您必须使用强制转换void来抑制可能的警告。

    [[nodiscard]]

    表示从函数返回时必须使用结果。它既可以应用于类型(当声明类或枚举时),也可以直接应用于函数的返回类型。例子:

    [[nodiscard]]
    int f() { return 42; }
    ...
    f(); // сообщение о том, что результат функции не использован
    

    将结果显式转换为void覆盖属性的效果:

    static_cast<void>(f()); // нет предупреждения о не использованном результате
    

    或者,可以使用赋值std::ignore:

    #include <tuple>
    std::ignore = f(); // нет предупреждения о не использованном результате
    

    从 C++20 开始,您可以使用可选的字符串文字来解释属性存在的原因,类似于 attribute [[deprecated]]。

    [[noreturn]]

    表示该函数不返回控制权。可以应用于函数声明。与通过抛出异常、执行永恒循环或中断整个程序的执行来结束其工作的函数相关。例子:

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

    如果标有该属性的函数[[noreturn]]返回对其中一个执行分支的控制,则会导致未定义的行为。

    [[no_unique_address]]

    表示该类的非静态数据成员是一个可能重叠的子对象(不能应用于位域)。这意味着一个成员可以与这个或基类的另一个非静态数据成员共享一个地址,通常插入到对象末尾的占位符可以用来存储其他成员。例子:

    template<typename Key, typename Value,
    typename Hash, typename Pred, typename Allocator>
    class hash_map {
      [[no_unique_address]] Hash hasher;
      [[no_unique_address]] Pred pred;
      [[no_unique_address]] Allocator alloc;
      Bucket *buckets;
    // ...
    public:
    // ...
    };
    

    这里hasher,pred和alloc可以具有相同的地址,就buckets好像它们对应的类型为空一样。

    • 44

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5