分析 chrome 源码中 WARN_UNUSED_RESULT 宏

举报
liuzhen007 发表于 2021/10/28 22:33:07 2021/10/28
【摘要】 目录问题解决结尾 问题今天浏览 chrome 源码时,发现了一个非常有意思的宏定义,它就是 WARN_UNUSED_RESULT ,用法如下图所示:分析之后,发现它其实就是 warn_unused_result 的变形,那么这个标识有什么作用呢? 解决今天我们就来揭晓这个问题的答案。首先,我们来看一下 chrome 源码中关于这个宏的定义,源码如下:// Annotate a functio...
  • 目录
  • 问题
  • 解决
  • 结尾

问题

今天浏览 chrome 源码时,发现了一个非常有意思的宏定义,它就是 WARN_UNUSED_RESULT ,用法如下图所示:

image.png

分析之后,发现它其实就是 warn_unused_result 的变形,那么这个标识有什么作用呢?

解决

今天我们就来揭晓这个问题的答案。

首先,我们来看一下 chrome 源码中关于这个宏的定义,源码如下:

// Annotate a function indicating the caller must examine the return value.
// Use like:
//   int foo() WARN_UNUSED_RESULT;
// To explicitly ignore a result, see |ignore_result()| in base/macros.h.
#undef WARN_UNUSED_RESULT
#if defined(COMPILER_GCC) || defined(__clang__)
#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
#define WARN_UNUSED_RESULT
#endif

通过定义,我们可以知道这个属性标识是可以被 gcc 和 clang 识别的。标识的作用是确保定义函数的返回值必须被使用,否则就会编译告警!

下面我们通过一个例子来看一下 标识的作用,代码实例如下:

int f1() __attribute__ ((warn_unused_result))
{
    return 1024;
}

class EmptyClass
{
};

EmptyClass f2() __attribute__ ((warn_unused_result))
{
    return EmptyClass();
}

int main()
{
    // 不会引发告警
    int x = f1();
    (void) x;
    f1(); // 引发警告
    f2(); // 引发警告

    return 0;
}

执行如下编译命令:

g++ -Wall -Wextra warn_unused.cpp -o warn_unused_result

编译后的结果如下图所示:

image.png

输出信息:

**warn_unused.cpp:20:5:** **warning:** **ignoring return value of function declared with 'warn_unused_result' attribute**

**[-Wunused-result]**

    f1(); // 引发警告

**^~**

**warn_unused.cpp:21:5:** **warning:** **ignoring return value of function declared with 'warn_unused_result' attribute**

**[-Wunused-result]**

    f2(); // 引发警告

通过这段实例代码,我们可以看到 warn_unused_result 的作用还是非常明确的,而且使用也非常方便。

结尾

使用这个属性封装的宏的好处就是能够显式的要求开发人员必须使用指定方法的返回值,在某些情况下有利于问题的排查和定位。因此,在实际编程过程中,合理使用某些属性标识,能够解锁很多新技能。特别是学习别人的源码,对自己编程能力的提升也是一定帮助作用的。大家好,我是 liuzhen007,华为云享专家、CSDN博客专家,欢迎关注我!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。