前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++17常用新特性(七)---新的属性和属性特性

C++17常用新特性(七)---新的属性和属性特性

作者头像
CPP开发前沿
发布于 2022-04-13 07:30:46
发布于 2022-04-13 07:30:46
1.5K00
代码可运行
举报
文章被收录于专栏:CPP开发前沿CPP开发前沿
运行总次数:0
代码可运行

C++17 增加了一些新的属性,这些属性并不是强制使用,但是正确使用后确实能够帮助我们避免一些问题,而这些问题恰恰是在做项目的时候容易忽略的,比较常见的一类问题是在前面把变量全部进行了定义,但是后面没有使用,还有一种是对于函数的返回值没有进行判断等,在本文中,将主要对C++17新增的一些属性进行解释和说明。

1 [[nodiscard]] 属性 [[nodiscard]]属性主要功能是可以让编译器在某个函数的返回值未被使用时进行告警,当然也可以不使用,或者使用后在后面的操作中也可以忽略这种警告。在实际编码时下面这三种场景是使用[[nodiscard]]性价比最高的地方:

  • 内存泄漏:在使用一些C语言的内存申请函数时,如malloc和realloc函数,如果使用时内存已经申请,但是没有对返回值进行恰当处理,可能会遗漏资源的释放,从而导致内存泄露。
  • 异常的奇怪的行为:如果没有对函数的返回值进行正确判断紧接着就进行了后面的操作,可能导致进程异常,如:获取对象实例的指针时,如果没有成功就在后面的代码中进行使用,就会导致进程异常。
  • 额外的开销:没有判断程序返回码从而做了一些额外的操作,造成资源的浪费。

针对上面的场景,参考代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
[[nodiscard]] bool empty() const noexcept;

如上,在判断为空的函数前使用了该属性,如果在后面的使用时没有对返回值进行判断,编译器就会告警。当然在实际的使用中如果不想进行告警,还可以强转接口的返回值为void。从而避免编译器告警。

代码语言:javascript
代码运行次数:0
运行
复制
(void)empty();

另外,在实际编程时,判断是否为空的下一步如果不为空可能就会直接调用清理函数对资源进行回收。但是如果没有判断返回值,就会对空的资源进行清理清理,从而造成程序的额外操作,造成不必要的开销,同理,如果是获取指针,没有判断指针是否为空就直接使用,将会造成严重的后果。

在使用[[nodiscard]]属性时,如果在类里使用了该属性的成员函数被覆盖时如果没有在派生类中再次标记将不会生效,这一点也是在使用时需要注意的地方。

2 [[maybe_unused]] 属性

[[maybe_unused]] 可以抵消[[nodiscard]] 属性产生的效果,主要功能是避免编译器在某个变量未被使用时产生告警。该属性可以应用于类的声明、使用typedef 或者 using 定义的类型、变量、非静态数据成员、函数、枚举类型、枚举值等场景。

具体效果如下面代码所示:

  • 参数可能不被使用
代码语言:javascript
代码运行次数:0
运行
复制
void foo(int iVal, [[maybe_unused]] std::string strMsg)
{
}
  • 可能不被使用的类成员函数
代码语言:javascript
代码运行次数:0
运行
复制
class QuickStr{
private:
    char cKey;
    int iCount;
    [[maybe_unused]] char LargerCha[100];
};
  • 可以在函数声明时使用但是不能在执行语句前使用
代码语言:javascript
代码运行次数:0
运行
复制
[[nodiscard]] void* foo();

int main()
{
    [[nodiscard]] foo();
    return 0;
}

代码执行后,编译器错误为:

3 [[fallthrough]] 属性 [[fallthrough]] 属性主要功能是可以让编译器帮忙检查在switch语句中没有使用break时避免产生告警。如下代码所示:

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
    int i=1;
    switch(i)
    {
        case 1:
            break;
        case 2:
        [[fallthrough]];
        case 3:
        [[fallthrough]];
        default:
        break;
    }
    return 0;
}

4 通用的属性扩展

  • 标记命名空间
代码语言:javascript
代码运行次数:0
运行
复制
namespace [[deprecated]] DraftAPI {
...
}
  • 标记枚举值
代码语言:javascript
代码运行次数:0
运行
复制
enum class Pet { 
    DOG = 0,
    CAT = 1,
    PIG = 2,
    bird [[deprecated]] = 3,
};

如上,枚举值bird已经被标记废弃。

  • 使用 using 前缀

实际编程时,用户会自定义命名空间,并包含自己定义的一些属性,这些属性在引用时通常需要加上自定义的命名空间,C++17后就可以简化来写了。前提是使用using标记。如下代码所示:

代码语言:javascript
代码运行次数:0
运行
复制
[[using MyLib: WebService, RestService, doc("html")]] void foo();

如果已经使用了using,在后面的自定义属性中继续加上命名空间的话编译将会报错。

5 总结

本文中的三个新属性由 Andrew Tomazos在https://wg21.link/p0068r0中首次提出。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CPP开发前沿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
[译]C++17, 语言核心层变化的更多细节
在之前的文章中我介绍了一些C++17语言核心层的变化,这次我会介绍更多的相关细节,涉及的主题有:内联变量(inline variables),模板,auto相关的自动类型推导以及属性(attributes).
用户2615200
2022/01/12
7660
[译]C++17, 语言核心层变化的更多细节
C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象
从C++标准产生一直到C++17,C++标准一直在试图减少某些临时变量或者拷贝的操作,虽然经过优化后,可能在实际执行中不需要调用拷贝或者移动构造,但是它必须隐士或者显示存在,如下面的案例,如果在类中禁止编译器默认生成拷贝构造和移动构造函数,代码将不会被编译通过。
CPP开发前沿
2022/04/13
1.3K0
C++17常用新特性(五)---强制省略拷贝或传递未实质化的对象
C++ 中文周刊 第76期
从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态
王很水
2022/09/23
2570
C++17 命名空间的新特性:简化与优化的典范
C++17作为C++语言的一个重要版本,不仅引入了许多新特性,还对现有特性进行了优化和简化。其中,命名空间(namespace)的改进是C++17中值得关注的亮点之一。这些改进旨在减少代码冗余、提高可读性和可维护性,同时让开发者能够更高效地组织和管理代码。本文将详细介绍C++17在命名空间方面的三个主要新特性:
码事漫谈
2025/01/24
360
C++17 命名空间的新特性:简化与优化的典范
C++0x 通用属性
C++在不断的发展,但每一阶段的C++标准提供的功能都很难完全满足现实需求,于是为了弥补标准的不足或者扩增特性应用场景所需的特性,各大C++编译器厂商多多少少在标准之外都增加了不少有用的扩展功能。这些扩展功能并不在C++的标准中,但是却经常被使用。有时候,C++标准委员会也会考虑这些标准之外的扩增特性,将其纳入标准之中。
恋喵大鲤鱼
2018/09/27
9150
【翻译】C++17的新特性简介
上一篇翻译了C++14的新特性简介,这篇就是Anthony Calandra在https://github.com/AnthonyCalandra/modern-cpp-features/blob/master/CPP17.md 中对C++17重要的新特性的简介。原文中有些地方写得不是很好理解所以对其做了少量修改
ZifengHuang
2020/07/29
3.1K0
【翻译】C++17的新特性简介
What's New in LLVM 9
导语 :这绝不仅仅是一篇 WWDC 2017 Session 411 学习笔记。除了有关 LLVM 9.0 的新特性之外,还有关于静态分析器和 Clang 5 Objective-C ARC 的一点看
MelonTeam
2018/01/04
2.5K0
What's New in LLVM 9
C++17 新增属性详解
C++17标准引入了多个新的属性(Attributes),这些属性为代码提供了更丰富的语义表达能力,同时帮助编译器生成更优化、更安全的代码。本文将详细介绍C++17中新增的三个重要属性:[fallthrough]、[maybe_unused] 和 [nodiscard]。
码事漫谈
2025/01/24
270
C++17 新增属性详解
C++17常用新特性
每次C++版本的发布都会带来很多新的特性,C++17也不例外,虽然有很多期待的特性没有包含进来,但是新增的特性依然挡不住它独特的魅力。
CPP开发前沿
2021/11/16
2.3K0
C++17常用新特性
《C++中属性(Attribute)的深度探秘:提升代码质量与性能的利器》
在 C++的世界里,属性(Attribute)是一个强大却常常被忽视的特性。它为程序员提供了一种向编译器传达额外信息的方式,能够在代码的可读性、可维护性以及性能优化等方面发挥重要作用。随着 C++标准的不断演进,属性的种类也日益丰富。本文将深入探讨 C++中常见的属性及其应用场景。
程序员阿伟
2024/12/09
1040
C++那些事之nodiscard
自C++17引入[[nodiscard]]属性以来,我们在编写API时有了一种更强大的工具,用于标记那些在调用时不应该被忽略的函数返回值。在本文中,我们将深入探讨[[nodiscard]]的用法,并注意一些潜在的陷阱。
公众号guangcity
2023/12/01
8630
C++那些事之nodiscard
全面盘点17个C++17的高级特性
C++17是目前比较常用的版本之一,今天花时间来梳理一下17个重要特性,所有的特性也不止这么点。
公众号guangcity
2024/03/22
3.6K0
全面盘点17个C++17的高级特性
【笔记】《深入理解C++11》(下)
本篇是看完《深入理解C++11:C++11新特性解析与应用》后做的笔记的下半部分. 这本书可以看作是《C++Primer》的进阶版, 主要是更加详细地介绍了C++11的一些常用设计和标准库设施, 很多知识点都在面试中会遇到, 值得一读.
ZifengHuang
2022/11/18
1.1K0
【笔记】《深入理解C++11》(下)
C++属性 - maybe_unused
在C++17中,[[maybe_unused]] 属性被引入,用于标记那些可能不会被使用的实体。被标记为 [[maybe_unused]] 的代码,即使在某些编译条件下未被使用,编译器也不会发出“未使用”警告。这对于大型项目和跨平台代码尤为重要,特别是在某些变量、函数、类型只在特定条件下有用的情况下。
程序员的园
2024/10/28
1840
C++属性 - maybe_unused
【笔记】C++2.0新特性
本篇是这段时间看的侯捷关于C++的课程《C++2.0新特性》的笔记,课程内容大家自己找吧。这个课程主要是我用来回顾C++11的特性和拾遗的,因此笔记中只记录了我认为课程中比较重要的内容。这门课的很多内容都来自《C++标准库》和《Modern Effective C++》,在看了在看了。
ZifengHuang
2022/03/04
9150
【笔记】C++2.0新特性
我常用的C++关键字
在日常代码书写代码时可以借助C++关键字,简化C++代码书写,提高代码的安全性、效率和可读性。当前我常用关键字如下含有delete、default、nodiscard、const、constexpr、override和final。
程序员的园
2024/07/18
690
我常用的C++关键字
C++一分钟之-属性(attributed)与属性语法
在C++编程领域,属性(attributed)作为一种元数据的形式,为源代码提供了额外的信息,帮助编译器、链接器或其他工具更好地理解代码的意图。虽然C++标准库本身并未直接定义一套属性系统,但C++11开始支持了属性语法,允许编译器供应商和第三方库定义自己的属性。本文旨在深入浅出地介绍C++属性的基本概念、常见问题、易错点以及如何避免这些问题,并通过代码示例加以说明。
Jimaks
2024/06/28
1200
C++17 New Features
如果说 C++11 和 C++20 是两个改动大、影响比较深远的"大版本",那么我感觉 C++17 算是一个小版本。(推荐 vs2019,gcc8,clang10,支持 C++17)
JIFF
2020/06/09
1.1K0
C++17常用新特性(八)---其他不常用语言特性
C++17版本中,标准委员会同时对一些小的特性进行发布。在本文中,将对一些细小的特性进行梳理。欢迎批评指正。
CPP开发前沿
2022/04/13
7410
C++17常用新特性(八)---其他不常用语言特性
谈谈C++新标准带来的属性(Attribute)
从C++11开始,标准引入了一个新概念“属性(attribute)”,本文将简单介绍一下目前在C++标准中已经添加的各个属性以及常用属性的具体应用。
C语言与CPP编程
2021/07/27
6670
谈谈C++新标准带来的属性(Attribute)
相关推荐
[译]C++17, 语言核心层变化的更多细节
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文