分析 chrome 源码中 WARN_UNUSED_RESULT 宏
【摘要】 目录问题解决结尾 问题今天浏览 chrome 源码时,发现了一个非常有意思的宏定义,它就是 WARN_UNUSED_RESULT ,用法如下图所示:分析之后,发现它其实就是 warn_unused_result 的变形,那么这个标识有什么作用呢? 解决今天我们就来揭晓这个问题的答案。首先,我们来看一下 chrome 源码中关于这个宏的定义,源码如下:// Annotate a functio...
- 目录
- 问题
- 解决
- 结尾
问题
今天浏览 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
编译后的结果如下图所示:
输出信息:
**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)