如何正确使用 include-what-you-use

news2024/11/16 0:38:11

在这里插入图片描述
简单地说,由 Google 开发的 include-what-you-use(IWYU)让源代码文件包含代码里用到的所有头文件。这种方法确保在改动了一些接口之后,代码依然最有可能编译成功。

之前我写了一篇关于 include-what-you-use 工具的文章,它会建议使用提前声明来加速编译时间,并且检测可能导致可移植性问题的对间接包含的意外依赖。

但是,你也可能注意到该工具引起的一些负面问题。

1、问题:确保间接包含

在这里插入图片描述

你首先会注意到的一个问题是,遵循“包含你所使用的”有时候会造成一些困扰。使用一种包含其它头文件的“便捷头文件”是一种常见操作,许多 Boost 类库使用了这一方法。例如,我们包含了 boost/mp11.hpp 来使用所有 Boost.Mp11 里提供的元编程相关的工具。

#include <boost/mp11.hpp>

using my_types = boost::mp11::mp_list<int, char, float>;

但是 IWYU 并不知道这一点,相反它建议我们包含 boost/mp11/detail/mp_list.hpp 以使用 mp_list,而这显然是错的。

如果你在编写一个类库,你可以使用一种特殊的注释来修复该问题 // IWYUpragma: export:

// somewhere in a Boost.Mp11 header file
#include <boost/mp11/detail/mp_list.hpp> // IWYU pragma: export

这里告诉了 IWYU 这一行的头文件里的内容都确认被上面包含的头文件包含了并可以使用。

提示:当编写类库是使用“便捷头文件”并且要使用 IWYU,使用 // IWYU pragma: export (或者是更加常用的 begin_exports/end_exports)来标识已经确认包含了的头文件。

如果你不是在编写类库,使用 // IWYU pragma: keep 来告诉IWYU 确保该头文件要被保留检测到,但是并没有指令能确认包含该头文件就一定是正确的。

所以的指令可以在这里查看:https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md

2、非侵入指令:映射文件

在这里插入图片描述

解决以上问题有个非侵入式的方法:创建映射文件,在映射文件里你可以定义哪些符号应该对应哪些头文件。

在我们的例子里,我们想指定 boost::mp11::mp_list 是由 boost/mp11.hpp 提供的。所以我们创建一个 mp11.imp 文件,包含以下内容:

[
{ symbol: ["boost::mp11::mp_list", "private", "<boost/mp11.hpp>", "public"] }
]

该文件的语法类似 JSON,包含了一些数组类型的指令。在这里,我们使用 symbol 指令,来指定具有某种可见性(因为某些原因这里必须是 private)的某个特定符号(boot::mp11::mp_list),是由某个具有某种可见性(通常是 public)的指定头文件(boost/mp11.hpp)提供的。

然后我们使用 -Xiwyu -mapping_file=mp11.imp 将这该映射文件传递给 IWYU,IWYU 就不会在提示过多的信息了。

提示:使用一个符号映射文件来告诉 IWYU 你要包含哪些头文件,所有符号都可以用该方法,但是有点太过繁琐。

不过好在还有个更好的方法:我们可以使用 include 指令来将一个头文件重映射到另一个头文件,或者将一整个文件夹重映射到一个头文件:[ { include: [“@<boost/mp11/.*>”, “public”, “<boost/mp11.hpp>”, “public”] } ]

这里的 @ 是一个通配符,我们在这里把在指定文件夹里的所有头文件(我们认为是公共的)映射到另一个头文件(我们认为也是公共的)。

IWYU 不会再提示任何 boost/map11/*里的头文件,而是提示 boost/mp11.hpp。而既然我们已经在代码里包含了,所以也就一切正常。

提示:使用包含映射让一个头文件或者多个头文件映射为另一个头文件。

最后的指令是 ref,让多个 .imp文件合并为一个。

请查看这些关于映射文件的文档:https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUMappings.md

3、结论

就个人来讲,我并不为映射文件困扰,而不必困扰是因为我从不自动运行 IWYU,一般是手动运行并查看它输出的建议变更。这样做是非常值得的,通过清理一些不必要的包含指令,我可以明显提升编译的速度。

期望以后模块化可以让这些操作变得不再必要。

4、让 IWYU 更上一层楼

在游戏、自动化、金融和其它前沿领域的公司,都面临着在高峰时段增加计算能力的需求和更快地响应市场的压力,仅仅使用 IWYU 是无法完全应对这些挑战的。

通过将任务分布在网络中的本地机器或者是虚拟机上,并且无缝地运行,Incredibuild 的创新解决方案可以为耗时的任务进行加速,例如编译、测试和其它任务。这让各种大小不同的组织都可以用一套完整的解决方案来保证速度、准确性和透明可见。

点击了解 Incredibuild 加速 C/C++ 构建编译的解决方案,并获取试用 License!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1813913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

arcgis如何给没有连通的路打交点

1、在打交点的时候需要先有图层&#xff0c;图层的构建流程如下所示 1、找到目录 2、先新建一个文件夹 3、在新建的文件夹下新建一个文件地理数据库 4、在文件地理数据库下&#xff0c;新建一个要素类数据集 5、在要素类数据集下进行数据导入&#xff0c;选择单个导入 6、在要…

Paddle Graph Learning (PGL)图学习之图游走类deepwalk、node2vec模型[系列四]

更多详情参考&#xff1a;Paddle Graph Learning 图学习之图游走类模型系列四 https://aistudio.baidu.com/aistudio/projectdetail/5002782?contributionType1 相关项目参考&#xff1a; 关于图计算&图学习的基础知识概览&#xff1a;前置知识点学习&#xff08;PGL&a…

❤ node报错总结

❤ node报错总结 &#xff08;expressJWT版本语法&#xff09;expressJWT is not a function 导入和使用expressJWT时遇到问题 import expressJWT from express-jwt app.use(expressJWT({ secret: secretKey }).unless({ path: [/login] }))原因 由于express-jwt 版本的更…

JS基础与高级应用: 性能优化

在现代Web开发中&#xff0c;性能优化已成为前端工程师必须掌握的核心技能之一。本文从URL输入到页面加载完成的全过程出发&#xff0c;深入分析了HTTP协议的演进、域名解析、代码层面性能优化以及编译与渲染的最佳实践。通过节流、防抖、重复请求合并等具体技术手段&#xff0…

esp32s3-gc9a01-lvgl

前言 近期做了一个项目是使用esp32s3 准亿科技的TFT屏幕 该屏幕使用的驱动IC为:GC9A01 通讯方式是:4线SPI , 三线spi和四线SPI区别在于:是否使用D/C信号线 开发LCD屏幕驱动, 可以参考乐鑫官网LCD显示屏指南 SPI 一共有4种工作模式. 根据接线 , 驱动方式的不同. 可分3 , …

【ARM Cache 及 MMU 系列文章 1.4 -- 如何判断 L3 Cache 是否实现?】

文章目录 Cluster Configuration Register代码实现什么是Single-Threaded Core?什么是PE(Processor Execution units)?Single-Threaded Core与PE的关系对比多线程(Multithreading)Cluster Configuration Register 同 L2 Cache 判断方法类似,ARMv9 中也提供了一个自定义…

程序设计实践--3

递推 一只小蜜蜂 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房&#xff0c;不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。其中&#xff0c;蜂房的结构如图所示。 输入描述 输入数据的第一行是一个整数N(1<n<1,000,000),表示测试实例的个数&#xff0c;然…

我的网络安全之路——一场诗意的邂逅

文章来源&#xff5c;MS08067 安全实验室 本文作者&#xff1a;tuooo 我的网络安全之路 一场诗意的邂逅 童年的星光中&#xff0c;我仰望着璀璨的荧屏&#xff0c;心怀对未知机器世界的浩瀚与好奇。那时的我&#xff0c;每每想到各种游戏的破解版本与工具&#xff0c;便会被技术…

在欧拉系统中搭建万里数据库MGR集群(图文详解)

在信创和国产化的大趋势下&#xff0c;将各个中间件进行国产化替换是当前非常重要的任务之一。下面将介绍如何在国产化欧拉系统中安装国产万里数据库。 0.MGR简介 MGR&#xff08;MySQL Group Replication&#xff09;&#xff1a;是MySQL官方提供的一种高可用性和容错性解决…

【java计算机毕设】智慧图书管理系统javaweb MySQL springboot vue html maven送文档

1项目功能截图 【java计算机毕业设计分享】 智慧图书管理系统 Java SpringBoot vue HTML MySQL idea送文档 2项目介绍 系统功能&#xff1a; 智慧图书管理系统包括管理员和读者两种角色。 管理员的功能包括在个人中心修改个人信息和密码&#xff0c;基础数据管理模块包含读者类…

哪款桌面便签软件功能全面且用户评价高?

在日常生活中&#xff0c;便签软件已成为我们不可或缺的小助手。想象一下&#xff0c;在工作或学习时&#xff0c;你能够随时在桌面上看到自己的任务事项&#xff0c;这无疑会大大提高你的效率。便签软件不仅能帮助我们记录重要事项&#xff0c;还能提醒我们按时完成各项任务&a…

IDEA:配置Golang的开发环境及异常

1、下载&安装 进入GO的官网下载对应的GO 我们可以下载安装版&#xff0c;不过本人习惯下载解压版&#xff0c;这个因个人而异 2、配置环境变量 GOBIN : %GOROOT%\bin GOPATH : D:\MyGo 工作区间 GOROOT : D:\Program Files\Go GOJDK地址PATH: %GOBIN% ; %GOROOT%\bin ; …

如何进行考试成绩分析

一、为什么要对考试成绩进行分析&#xff1f; 考试成绩进行分析是一项重要的工作&#xff0c;可以为学生、教师和学校提供有效的学习评价和支持&#xff0c;同时也可以为教学改进和提高教学质量提供有力的支持和指导。对考试成绩进行分析有以下几个原因&#xff1a; 1.了解学生…

液化天然气巡检机器人:LNG 行业的创新守护者

在当今能源领域&#xff0c;液化天然气&#xff08;LNG&#xff09;作为一种清洁、高效的能源正扮演着越来越重要的角色。然而&#xff0c;LNG的生产、存储和运输都面临着高温高压、易燃易爆等巨大风险。为确保安全运营和高效管理&#xff0c;液化天然气行业迫切需要一种创新的…

电压是如何产生的

学过初中物理的人都知道&#xff0c;电源可以产生电压&#xff0c;电子们在电源电压的驱动下&#xff0c;产生定向移动形成电流。电流具有能量&#xff0c;人类学会了利用这股能量&#xff0c;从此科技突飞猛进。然而大部分教材都是从宏观的角度去描述电压这个概念&#xff0c;…

Keil MDK 下载安装相对应CPU的Software Packs

要下载MDK ARM的Software Packs&#xff0c;您可以按照以下步骤进行&#xff0c;这些步骤结合了参考文章中的信息并进行了适当的归纳和整理&#xff1a; 1. 访问Keil官网 打开浏览器&#xff0c;访问Keil的官方网站&#xff1a;www.keil.arm.com。 2. 进入Software Packs下载…

PDF操作工具

PDF的转换、编辑、删除、文本识别、添加水印等等各种操作用的越来越多&#xff0c;相信很多朋友都有WPS等软件的会员、可是更多的朋友是没开通WPS等软件的会员的&#xff0c;那么怎么办呢&#xff0c;给你们推荐一款pdf操作的工具。 PDF24 Creator是一款免费且流行的 PDF 解决…

服务器制作RAID磁盘阵列并管理

1. 规划节点 主机规划 IP主机名节点192.168.100.10localhost控制节点 2. 基础准备 使用VMWare Workstation软件安装CentOS 7.2操作系统&#xff0c;镜像使用提供的 CentOS-7-x86_64-DVD-1511.iso&#xff0c;并添加4块20 GB硬盘。YUM源使用提供的 mdadm_yum文件夹。 1. 创…

探索工厂智能制造解决方案的革新与应用

随着工业4.0时代的到来&#xff0c;工厂智能制造解决方案正在以前所未有的速度和规模改变着传统制造业的面貌。从自动化生产到智能化管理&#xff0c;工厂智能制造解决方案正在为制造企业带来前所未有的效率提升和竞争优势。本文将深入探讨工厂智能制造解决方案的革新与应用&am…

Error:Kotlin: Module was compiled with an incompatible version of Kotlin.

一、问题&#xff1a;运行spring boot项目时&#xff0c;idea报出错误&#xff1a;时提示报错如下图&#xff1a; 错误代码&#xff1a; Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected …