是否可以使用 clang 自动包含缺失的 C++ 头文件?

问题描述 投票:0回答:2

我的计划是使用 clang 解析代码并找到类型 undefined ,然后找到相应的头文件,最后在文件中插入 #include"xxx" 。 clang 可以做到这一点吗?

我想我应该更详细地描述我的问题,这样可以更容易解决。 我有一个很大的项目,需要很长时间才能完成。我发现几乎每个 cpp 文件都包含“common.h”,它由许多头文件组成。所以我想清除“common.h”中的头文件,并在每个cpp中插入必要的头文件。这是一项非常无聊且耗时的工作。我想知道是否有任何自动方法可以提供帮助。

c++ clang header-files
2个回答
1
投票

IDE(或自动化工具)可以分析编译结果并提供建议(例如 xcode 这样做),但是并不是每个人都希望在程序员不知情的情况下自动修复代码。


1
投票

我不认为 clang 本身可以找出哪个头文件包含什么类型声明并提出应该使用哪个 include 。

您当然可以使用 clang 来确定特定翻译单元(源代码)中需要哪些类型以及头文件提供哪些类型,并且比

grep -r typename somedir /dev/null
更聪明,但也不会好多少。正如评论所说,您最终可能会建议错误的头文件 - 仅仅因为文件包含具有正确名称的类或结构定义(如果您更聪明的话,还包含内容),并不意味着它就是那个文件原作者打算使用。

主要问题是您必须索引所有现有的头文件,否则需要相当长的时间来解析每个可用源文件的所有内容。

我认为主要的困难是:

  • 不建议“错误的解决方案”。特别是当有多种解决方案时(例如,可移植代码有一个用于 Windows 的标头,另一个用于 Mac,另一个用于 Linux - 仅通过阅读源代码不可能选择正确的解决方案!)
  • 整理多个定义(各种头文件具有
    #if x; typedef a b; #endif
    序列的情况并不罕见,因此您通常会得到多个可以定义类型的位置)。
  • 处理需要
    #define
    才能正常工作的代码。
  • 确定名称何时是一个简单的拼写错误,而不是需要一个新的头文件。例如。
    std::sting blah = "blah";
    并不意味着您应该尝试找到
    std::sting
    类型,而是代码需要固定为
    std::string ...
  • 所需的链条。您需要添加
    #include "foo.h"
    ,但由于 foo.h 包含
    std::string
    (但不包含它),因此您还需要在包含 foo.h 之前添加
    #include <string>
  • 宏中声明的类型...可能会带来有趣的挑战...;)

从技术上来说,没有什么可以阻止建议解决特定编译器错误的头文件的解决方案[并且,如果需要,可以更新代码来解决问题 - 这只是一个文本文件操作的问题,为此目的并不是特别困难],但我认为大多数时候,熟悉该项目的用户会比这种解决方案做得更好。

© www.soinside.com 2019 - 2024. All rights reserved.