用于查找未使用的包含标头的工具? [关闭]

2023-12-03

I know PC-Lint可以告诉您有关包含但未使用的标头的信息。有没有其他工具可以做到这一点,最好是在 Linux 上?

我们有一个庞大的代码库,在过去 15 年里,大量的功能发生了变化,但是当功能从一个实现文件转移到另一个实现文件时,剩下的 #include 指令很少被删除,这给我们留下了相当大的混乱。显然,我可以做艰苦的事情,删除所有 #include 指令并让编译器告诉我要重新包含哪些指令,但我宁愿反向解决问题 - 找到未使用的指令 - 而不是重建已用指令的列表。


免责声明:我的日常工作是在一家开发静态分析工具的公司工作。

如果大多数(如果不是全部)静态分析工具没有某种形式的标头使用情况检查,我会感到惊讶。你可以使用this维基百科页面获取可用工具的列表,然后向公司发送电子邮件询问他们。

评估工具时您可能需要考虑的一些要点:

对于函数重载,您希望包含重载的所有标头都可见,而不仅仅是包含由重载解析选择的函数的标头:

// f1.h
void foo (char);

// f2.h
void foo (int);


// bar.cc
#include "f1.h"
#include "f2.h"

int main ()
{
  foo (0);  // Calls 'foo(int)' but all functions were in overload set
}

如果采用暴力方法,首先删除所有标头,然后重新添加它们直到编译,如果先添加“f1.h”,则代码将编译,但程序的语义已更改。

当您有部分和专业化时,类似的规则也适用。无论是否选择专业化,您都需要确保所有专业化都是可见的:

// f1.h
template <typename T>
void foo (T);

// f2.h
template <>
void foo (int);

// bar.cc
#include "f1.h"
#include "f2.h"


int main ()
{
  foo (0);  // Calls specialization 'foo<int>(int)'
}

对于重载示例,暴力方法可能会导致程序仍然可以编译但具有不同的行为。

您可以关注的另一种相关分析类型是检查类型是否可以前向声明。考虑以下:

// A.h
class A { };

// foo.h
#include "A.h"
void foo (A const &);

// bar.cc
#include "foo.h"

void bar (A const & a)
{
  foo (a);
}

在上面的示例中,不需要定义“A”,因此可以更改头文件“foo.h”,使其仅具有“A”的前向声明:

// foo.h
class A;
void foo (A const &);

这种检查还减少了标头依赖性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于查找未使用的包含标头的工具? [关闭] 的相关文章

  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • Datagrid wpf C# 应用程序中的复选框

    我正在使用数据网格为学生记录创建一个 C wpf 应用程序 如何在标题中创建复选框以选择 取消选择一行中的所有复选框 如何一键选中行中的复选框以便我们可以编辑 删除记录 我们如何选择多个复选框来删除 我创建了一种行为 允许将控件中的属性绑定
  • 如何在 tsql contains 函数中搜索 &(与号)?

    我有一个表 T 其中有一个列 C 其中包含包含字符 的文本 但是如果我执行以下查询 它不会返回任何内容 尽管我可能有 10 行 SELECT FROM T WHERE Contains C a b 使用双引号使其成为搜索词 SELECT F
  • 从 Asm 访问 C 中定义的全局变量

    我有一个包含全局变量 foo 的 C 文件 我如何访问foo来自另一个汇编程序 我使用 i586 elf as GNU 汇编器 和 i586 elf gcc gnu 编译器 进行构建 您可以只使用交易品种名称 as将所有未定义的符号视为外部
  • EF Core DB First,以及如何避免模型生成时的构造函数覆盖

    我将不再对 Azure DB 使用 SQL 身份验证 而是使用 Active Directory 托管身份验证 如此处所述article 基本上 我正在做两件主要的事情来使其正常工作 1 在 DBContext 构造函数中注入令牌 publ
  • 在 Azure 上部署 Django 应用程序:即使在部署后也仅显示默认应用程序

    我正在尝试将 Web 应用程序部署到 Azure 我正在遵循这些指示https azure microsoft com en us documentation articles web sites python create deploy
  • 通过类路径执行 java -jar vs 在 jar 文件目录中执行 java -jar

    使用 NetBeans 创建 Java 程序后 将其称为 Addition 然后在文件夹 c Users Ben Doc NetBeansProjects Addition dist 中成功清理并构建可执行 Jar 文件 为什么在执行时 从
  • 使用ajax时如何清除缓存数据?

    我正在使用 Ajax 根据某些 ID 从服务器检索数据 如下所示 以执行自动建议功能 但是 当我提交表单并更新数据库时 自动建议字段假设不应再包含此 ID 的任何内容 但它仍会从缓存中检索数据 有谁知道如何清除缓存并使Ajax发送请求以在每
  • 如何使用 WatiN 检查 PDF 是否在浏览器中成功打开?

    我正在使用 WatiN 库在部署后对网站进行快速冒烟测试 除此之外 我想确保当我单击页面上的特定链接时 会在浏览器中打开 PDF 单击链接很容易 但如何检测 Acrobat Reader 是否已在浏览器窗口中成功打开 我想捕获 404 服务
  • /d2vzeroupper MSVC 编译器优化标志有什么作用?

    是什么 d2vzeroupperMSVC编译器优化标志在做什么 我正在阅读此编译器选项快速参考指南 对于 AMD 的 Epyc CPU https developer amd com wordpress media 2020 04 Comp
  • Android导入库

    在我的项目中 我需要使用外部库 该库包括 class文件 我已使用此库将文件夹添加到我的项目中属性 gt Java 构建路径 gt 库 gt 添加类文件夹 我可以毫无问题地编译项目 但是当我运行它时 我得到failed resolving
  • 使用 websocket 发送私人消息

    我们如何使用 Websockets 和 PHP 实现私人消息系统 客户端到客户端 据我了解 服务器广播消息 所有客户端都可以通过 connection onmessage 事件处理程序接收消息 我想知道是否有一种方法可以将消息仅发送给网络套
  • UWP DatagramSocket 多播

    我设法制作了一个简单的应用程序 可以从多播组发送和接收数据 如果我打开应用程序的 2 个实例 具有相同代码的 2 个不同的 sln 文件 我可以发送和接收数据 问题是 5秒后 如果我从Client001发送消息 只有Client001会收到
  • 什么时候可以将日期时间存储为本地时间而不是 UTC?

    这是一个类似于this one 我真的很想在我的应用程序中将日期时间存储为本地时间而不是 UTC 这被认为是最佳实践 在应用程序中 我发生了许多事件 每个事件都分配给给定的位置 当我向用户显示它们时 我总是想显示local活动时间 IE E
  • 在 ruamel 中往返时按原样保留多行字符串

    假设我有一个像这样的文件 test long This is a sample text across two lines 当我加载文件并将其转储回来而不对文件进行任何更改时 它会将此文档更改为 test long This is a sa
  • Swift TableView 转至新的 ViewController,但索引路径错误(倒数第二个选择)

    我有一个奇怪的问题 我有两个 TableView 一个用于显示项目 另一个用于显示所有团队成员 对于两个 TableView 我都有相同的错误 当用户单击项目 团队成员时 我想显示其详细信息 奇怪的是 当运行应用程序并且我第一次选择项目 团
  • 在 Xcode 的 Foundation 代码示例中遇到“cleanup:”。这是什么?

    所以在即将推出的一些示例代码中核心有声读物我遇到了一个陌生的符号 cleanup 它在调用某些 dispose myStuff 函数之前使用 它前面没有 或 似乎你可以输入任何单词 后跟一个冒号 它就会像注释一样 int main int
  • 将字符串转换为特定的日期时间格式

    我已经在谷歌上搜索了一段时间 但我似乎无法找到解决方案 我认为这很容易 但它花了太长时间 我转向 stackoverflow 我需要将包含日期和时间的字符串转换为 DateTime 变量 我已将字符串格式化为我想要存储的确切格式 但是当我将
  • 任何避免警告 C6386 的方法,而不完全禁用它或代码分析

    默认情况下 Visual Studio 2019 开始将代码分析警告显示为编辑器内的绿色波浪线 这些对于学习 C 编程的学生来说可能非常有用 因为他们可以捕获经典错误 例如通过一个数组访问 不幸的是 误报可能会完全破坏学习体验 我担心我将不
  • 删除 Spark 字符串列的第一个字符

    我想知道正如我在标题中所说 对于以下两种情况 如何删除 Spark 字符串列的第一个字符 val myDF1 Seq 14326 1258634 15626 163262 toDF A val myDF2 Seq a14326 c12586
  • 用于查找未使用的包含标头的工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 I know PC Lint可以告诉您有关包含但未使用的标头的信息 有没有其他工具可以做到这一点 最好是在 Linux 上 我们有一个庞大的代码库 在过去 15 年里 大量的功能发生