添加#include';使用llvm-clang将s添加到程序的头中

添加#include';使用llvm-clang将s添加到程序的头中,clang,llvm,header-files,Clang,Llvm,Header Files,我需要通过使用LLVM和Clang对一个已经存在的程序进行转换来为它添加头文件 我使用了clang的重写器在更改函数名和参数等方面完成了类似的工作 但是头文件不在clang的AST中。我已经知道我们需要使用PPCallbacks(),但是如果可能的话,我非常需要一些关于如何使它与重写器一起工作的示例 或者,在第一个语句之前添加一个#include语句 using namespace <namespace>; 使用名称空间; 同样有效。我也想知道这方面的一个例子 任何帮助都将不胜

我需要通过使用LLVM和Clang对一个已经存在的程序进行转换来为它添加头文件

我使用了clang的重写器在更改函数名和参数等方面完成了类似的工作

但是头文件不在clang的AST中。我已经知道我们需要使用PPCallbacks(),但是如果可能的话,我非常需要一些关于如何使它与重写器一起工作的示例

或者,在第一个语句之前添加一个#include语句

using namespace <namespace>; 
使用名称空间;
同样有效。我也想知道这方面的一个例子


任何帮助都将不胜感激。

您的问题有点混乱。你需要详细地了解它是如何工作的。请注意,C++编译的大部分都是在预处理阶段发生的(因此大多数C++静态分析器在该阶段之后工作)。 P> > C++规范(和C规范)首先定义预处理,然后是预处理形式的语法和语义。 换句话说,在编译
foo.cc
时,编译器会看到预处理的表单
foo.ii
,您可以使用
clang++-C-efoo.cc>foo.ii

在20世纪80年代,预处理器
/lib/cpp
是一个由编译器派生的独立程序(一些临时
foo.ii
放在磁盘上,并在编译结束时删除)。今天,出于性能原因,它是在编译器内部完成的一些初始处理。但你可以把它当作是分开的

您要么想改变CLAN编译器,要么它主要处理(如其他C++编译器或C++静态分析器)。然后,您不想添加新的

#include
-s,但您想更改给定给编译器的流(预处理后),这是另一个问题:然后您想在现有AST元素之间添加一些AST(独立于任何预处理器指令)


或您希望自动更改C++源代码。困难的部分是决定你想要改变什么,在什么地方。我假设您使用了复杂的东西来确定必须在文件

foo.cc
的第34行之后插入一个
#include
。一旦您获得了这些信息(而且获取这些信息是很困难的),那么进行插入就非常简单了。例如,您可以读取每一个C++源代码行,并在您读取足够的行时插入您的行。

为什么不能在代码源代码中添加<代码> >包含< <代码>指令(原始代码< *> cc或<代码> *.CPP < /代码>文件)?您不需要使用Clang(当然,即使您可以使用复杂的静态分析技术,使用Clang和/或LLVM来确定要包含哪些头文件)。我的意思是,在一些源代码的开头添加一些预处理器指令非常简单(可以使用
sed
),问题是要知道要包含哪个头文件!这是我项目的一部分。我不允许手动更改文件。而且我确切地知道要包含哪个头文件!!但是您可以自动更改文件。如果不允许修改它们,那么这不是添加头文件的问题,而是在翻译单元中添加声明和定义的问题。添加的内容甚至可能不存在于任何头文件中。然后,您应该在预处理器阶段之外工作(因此头文件不再重要),只是头文件的顺序很重要。所以我想在其他头文件已经就位之后再放置新的头文件。我从一开始就知道了如何放置它。不,您需要并且想要处理代码的预处理形式,并且在这一点上头文件不再存在。或者您需要更改物理源文件,然后添加一些
#include
行非常简单(并且可以自动完成,只要您知道应该添加哪些预处理器指令以及在什么位置)。我有许多彼此不同的源文件。我不打算编译任何东西(例如,不使用“clang++”命令)。我正在运行ninja命令在bin/中创建一个可执行文件。我将我的文件提供给它,我可以看到我重新编写的代码作为输出(如果我愿意,还可以看到AST转储)。这可能有助于知道所有这些都是在LLVM构建工具的帮助下完成的。即使需要分析(而不是编译)C++代码,也需要进行预处理。