C + + 中的特性

简介

C + + 标准定义一组公共属性。 它还允许编译器供应商在特定于供应商的命名空间中定义自己的属性。 但编译器只需要识别在标准中定义的属性。

在某些情况下,标准属性与编译器特定的 __declspec 参数重叠。 在 Microsoft c + + 中,可以使用 [[deprecated]] 属性,而不是使用 __declspec(deprecated) 。 [[deprecated]]任何符合的编译器都将识别属性。 对于所有其他 __declspec 参数(如 dllimport 和 dllexport ),到目前为止没有等效的属性,因此必须继续使用 __declspec 语法。 属性不会影响类型系统,也不会更改程序的含义。 编译器将忽略它们无法识别的特性值。

Visual Studio 2017 版本15.3 及更高版本 (与) 一起使用 /std:c++17 :在属性列表的作用域中,可以使用单个引导指定所有名称的命名空间 using :

void g() {
    [[using rpr: kernel, target(cpu,gpu)]] // equivalent to [[ rpr::kernel, rpr::target(cpu,gpu) ]]
    do task();
}

C + + 标准特性

在 c + + 11 中,特性提供了用于批注 c + + 构造 (的标准化方法,包括但不限于类、函数、变量和块) 包含附加信息。 属性可能是特定于供应商的,也可能不是。 编译器可以使用此信息来生成信息性消息,或在编译特性化代码时应用特殊逻辑。 编译器会忽略它无法识别的任何属性,这意味着您不能使用此语法定义您自己的自定义属性。 属性用双方括号括起来:

[[deprecated]]
void Foo(int);

属性表示特定于供应商的扩展的标准化替代方法 #pragma ,如指令、 __declspec() (Visual C++) 或 attribute (GNU) 。 但是,在大多数情况下,你仍需要使用特定于供应商的构造。 标准版当前指定了符合一致性的编译器应识别的下列属性:

[[noreturn]] 指定函数从不返回;换句话说,它总是引发异常。 编译器可以调整实体的编译规则 [[noreturn]] 。

[[carries_dependency]] 指定函数传播线程同步的数据依赖项排序。 特性可应用于一个或多个参数,以指定传入的参数将依赖项传递到函数体中。 特性可应用于函数本身,以指定返回值将依赖项移出函数。 编译器可使用此信息生成更高效的代码。

[[deprecated]]Visual Studio 2015 及更高版本: 指定函数不应使用。 或者,它可能不存在于库接口的未来版本中。 当客户端代码尝试调用函数时,编译器可以使用此特性生成信息性消息。 [[deprecated]] 可应用于类的声明、typedef 名称、变量、非静态数据成员、函数、命名空间、枚举、枚举器或模板特殊化。

[[fallthrough]]Visual Studio 2017 及更高版本: (提供 /std:c++17) [[fallthrough]] 属性,可在语句上下文中将其用作 switch 对编译器的提示 (或读取代码的任何人() fallthrough 的行为)。 Microsoft c + + 编译器当前不会对 fallthrough 行为发出警告,因此此属性不会影响编译器行为。

[[nodiscard]]Visual Studio 2017 版本15.3 及更高版本: (提供 /std:c++17) 指定函数的返回值不应被丢弃。 引发警告 C4834,如以下示例中所示:

[[nodiscard]]
int foo(int i) { return i * i; }

int main()
{
    foo(42); //warning C4834: discarding return value of function with 'nodiscard' attribute
    return 0;
}

[[maybe_unused]]Visual Studio 2017 版本15.3 及更高版本: (与) 一起使用时,可 /std:c++17 指定不使用变量、函数、类、typedef、非静态数据成员、枚举或模板特殊化。 标记为 “未使用” 的实体时,编译器不会发出警告 [[maybe_unused]] 。 稍后可使用属性重新声明未使用特性声明的实体,反之亦然。 在标记为 " 已分析" 的第一个声明 [[maybe_unused]] 和当前翻译单元的其余部分中,实体被视为标记。

特定于 Microsoft 的属性

[[gsl::suppress(rules)]] 此特定于 Microsoft 的属性用于在代码中使用强制 指导原则支持库 (GSL) 规则的检查程序禁止显示警告。 例如,考虑以下代码片段:

int main()
{
    int arr[10]; // GSL warning C26494 will be fired
    int* p = arr; // GSL warning C26485 will be fired
    [[gsl::suppress(bounds.1)]] // This attribute suppresses Bounds rule #1
    {
        int* q = p + 1; // GSL warning C26481 suppressed
        p = q--; // GSL warning C26481 suppressed
    }
}

该示例引发了以下警告:

26494 (类型规则5:始终初始化对象。 )

26485 (界限规则3:没有数组到指针的衰减。 )

26481 (界限规则1:不要使用指针算法。 请改用跨距。 )

当你在安装和激活 CppCoreCheck 代码分析工具的情况下编译此代码时,将激发前两个警告。 但由于属性的原因,第三个警告不会激发。 您可以通过编写 [[gsl::suppress(bounds)]] 而不包含特定的规则号来禁止整个边界配置文件。 C++ Core Guidelines 旨在帮助你编写更好、更安全的代码。 “禁止显示” 属性可在不需要时轻松关闭警告。

该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处,本文章博客地址:https://blog.csdn.net/it_cplusplus/article/details/118501270

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值