分析 chrome 源码中 WARN_UNUSED_RESULT 宏

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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

问题

今天浏览 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博客专家,欢迎关注我!

猜你喜欢

转载自juejin.im/post/7018205925915754527