分析 chrome 源码中 WARN_UNUSED_RESULT 宏

  • 目录
  • 问题
  • 解决
  • 结尾

问题

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

分析 chrome 源码中 WARN_UNUSED_RESULT 宏

分析之后,发现它其实就是 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

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

分析 chrome 源码中 WARN_UNUSED_RESULT 宏

输出信息:

**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 的作用还是非常明确的,而且使用也非常方便。

结尾

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


作者简介:????大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,????公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!????

上一篇:使用Golang语言实现对指定存储桶的删除方法(下)


下一篇:关于点播视频文件生成封面的实现方案设计思考