我的计划是使用 clang 解析代码并找到类型 undefined ,然后找到相应的头文件,最后在文件中插入 #include"xxx" 。 clang 可以做到这一点吗?
我想我应该更详细地描述我的问题,这样可以更容易解决。 我有一个很大的项目,需要很长时间才能完成。我发现几乎每个 cpp 文件都包含“common.h”,它由许多头文件组成。所以我想清除“common.h”中的头文件,并在每个cpp中插入必要的头文件。这是一项非常无聊且耗时的工作。我想知道是否有任何自动方法可以提供帮助。
IDE(或自动化工具)可以分析编译结果并提供建议(例如 xcode 这样做),但是并不是每个人都希望在程序员不知情的情况下自动修复代码。
我不认为 clang 本身可以找出哪个头文件包含什么类型声明并提出应该使用哪个 include 。
您当然可以使用 clang 来确定特定翻译单元(源代码)中需要哪些类型以及头文件提供哪些类型,并且比
grep -r typename somedir /dev/null
更聪明,但也不会好多少。正如评论所说,您最终可能会建议错误的头文件 - 仅仅因为文件包含具有正确名称的类或结构定义(如果您更聪明的话,还包含内容),并不意味着它就是那个文件原作者打算使用。
主要问题是您必须索引所有现有的头文件,否则需要相当长的时间来解析每个可用源文件的所有内容。
我认为主要的困难是:
#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>
。从技术上来说,没有什么可以阻止建议解决特定编译器错误的头文件的解决方案[并且,如果需要,可以更新代码来解决问题 - 这只是一个文本文件操作的问题,为此目的并不是特别困难],但我认为大多数时候,熟悉该项目的用户会比这种解决方案做得更好。