当前位置: 首页 > news >正文

clang编译器 abseil-cpp中的ABSL_MUST_USE_RESULT

最近在看google的abseil-cpp,代码仓库地址为https://github.com/abseil/abseil-cpp

仓库使用的协议为Apache-2.0

abseil-cpp是一个开源的 C++ 库,由 Google 开发,提供了一系列工具和抽象来增强 C++ 代码的健壮性和可移植性

现在是2025-09-25 20:55,当前abseil-cpp代码库master分支最新提交的id为

473a0c7530afb9ca5d107a64a3de46f84be757b5

abseil-cpp项目可以使用cmake和g++编译,但是使用clang编译可以“激活”一些隐藏功能(下文单开一个小标题细说一个点)

首先安装clang

sudo apt-get install clang

安装好后写一个最简单的hello, world程序都提示iostream file not found,查阅资料发现clang是一个可插拔的组件式的编译器,而g++是一个开箱即用

查阅资料后首先安装了libc+±dev

sudo apt-get install libc++-dev

但是依旧

再次安装g+±12就可以正常编译了

sudo apt-get install g++-12

后面在论坛帖子 Clang can’t find iostream找到了答案,截个图


大概意思是,clang和clang++其实是在借用gcc和g++中的头文件。当安装了多个版本的gcc和g++的版本时,它会自动选择最新的版本

所以总结一下,我一开始提示找不到iostream原因:linux系统同时安装了gcc11和gcc12,编译时选择最新的版本,于是选择了gcc12和g++12。但是电脑没有安装g+±12,所以iostream找不到

使用clang编译这个项目,首先cmake生成需要使用命令(在build目录下)

CC=clang CXX=clang++ cmake ..

然后发现需要使用C++17,否则无法编译通过

CC=clang CXX=clang++ cmake -D CMAKE_CXX_STANDARD=17 ..

接下来make编译即可

clang 编译器编译 abseil-cpp 激活“隐藏功能”之ABSL_MUST_USE_RESULT

ABSL_MUST_USE_RESULT宏用于修饰一个函数,比如

ABSL_MUST_USE_RESULT int test() {return 42;
}

MUST USE RESULT即必须使用结果。当函数的结果未被使用时,比如

ABSL_MUST_USE_RESULT int test() {return 42;
}int main() {test();return 0;
}

编译时会给出警告

ABSL_MUST_USE_RESULT原理

// Copyright 2017 The Abseil Authors.#if !defined(__has_attribute)
#define __has_attribute(x) 0
#endif#ifdef __has_attribute
#define ABSL_HAVE_ATTRIBUTE(x) __has_attribute(x)
#else
#define ABSL_HAVE_ATTRIBUTE(x) 0
#endif#if defined(__clang__) && ABSL_HAVE_ATTRIBUTE(warn_unused_result)
#define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))
#else
#define ABSL_MUST_USE_RESULT
#endif

大伙可能被这一堆代码吓坏了(反正我被吓坏了doge)

其实这一堆代码是考虑了某些编译器不支持的情况,比如g++编译器就不支持

对于clang编译器把核心摘出来就是

#define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))

也就是说,由编译器实现检查一个被ABSL_MUST_USE_RESULT宏修饰的函数的返回值是否被忽略

对于clang编译器(即定义了__clang__属性),还会检查是否有__has_attribute,它用于检查是否支持其他属性;如果没有那就不支持ABSL_MUST_USE_RESULT宏,如果有,通过__has_attribute宏检查是否支持warn_unused_result,它最终实现了检查一个被ABSL_MUST_USE_RESULT宏修饰的函数的返回值是否被忽略

如果没有__has_attribute或者不支持warn_unused_result,那么ABSL_HAVE_ATTRIBUTE宏的实现为

#define ABSL_HAVE_ATTRIBUTE(x) 0

最终ABSL_MUST_USE_RESULT宏的实现为

#define ABSL_MUST_USE_RESULT

也就是将ABSL_MUST_USE_RESULT替换为空,从而忽略

但是测试发现g++编译器其实也可以实现该功能,于是修改代码为

#if (defined(__clang__) || defined(__GNUC__)) && ABSL_HAVE_ATTRIBUTE(warn_unused_result)
#define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))
#else
#define ABSL_MUST_USE_RESULT
#endif

这样一个PR不就来了么doge

PS:一觉起来得到了官方的回复。C++17已经引入了[[nodiscard]]来实现这一功能(PR其实没有必要QVQ)

http://www.dtcms.com/a/410971.html

相关文章:

  • 网站营销怎么做做公众号用什么网站吗
  • ReactUse 是一个为 React 开发者设计的实用工具库(陀螺仪、地理位置、虚拟列表、标签页通讯函数)
  • ORB-SLAM2之ORB特征提取
  • 【Anaconda】anaconda卸载重安装
  • 安徽元鼎建设公司网站opensns wordpress
  • 企业做的网站计入什么科目免费logo设计的网站
  • AI助手融合架构方案:融合“路由-执行”模式与Nacos 3.0的智能工具调用系统 (含核心实现代码)
  • (基于江协科技)51单片机入门:1.LED
  • 网上做任务挣钱的网站wordpress首页刷新不变
  • 西安信誉好的做网站的一键网页转app生成器
  • 二手硬件升级实战:5000元Threadripper 3960X AI工作站组装指南
  • 兑吧集团受邀参加2025华康会·DaJK大健康“源头创新·链动未来”创新论坛
  • 关于解决 libwebsockets 库编译时遇到的问题的方法:
  • 做外贸网站空间多少gwordpress 设置 logo
  • 涡街流量计温度数据的协议桥梁:Modbus RTU 转 Profinet 网关的自动化应用
  • 微企点建站效果付费关键词排名工具有哪些
  • VLA自动驾驶方案的设计及实现
  • 深度学习打卡第N7周:调用Gensim库训练Word2Vec模型
  • 18软件测试用例设计方法-错误推测
  • 我市精神文明建设的门户网站是学校网站建设代码
  • IBM开源轻量多模态文档处理模型:Granite-Docling 258M,能执行OCR、文档QA
  • 基于OCR的验证码识别与算术运算解析实践
  • 网站开发 网络工程 哪个好朝天门户网
  • 从零开始WebRTC(一)
  • K230基础-RTC时钟介绍及使用
  • 机器人定位器市场报告:2025-2031 年行业增长逻辑与投资机遇解析​
  • CTFHub RCE通关笔记3:文件包含 php://input
  • 北京做网站建设有发展吗使用wordpress编辑器
  • 我的第一个AI Agent
  • 郑州网站建设公司哪家好做购物网站需要什么资质