我想编写一个小工具,它接受一个C ++程序(单个.cpp文件),找到“main”函数并为其添加2个函数调用,一个在开头,一个在最后。
如何做到这一点?我可以使用g ++的解析机制(或任何其他解析器)吗?
答案 0 :(得分:8)
如果要使其稳定,请使用clang's libraries。
答案 1 :(得分:6)
正如一些评论者的建议,让我提出我的想法作为答案:
基本上,这个想法是:
... original .cpp file ...
#include <yourHeader>
namespace {
SpecialClass specialClassInstance;
}
SpecialClass
类似于:
class SpecialClass {
public:
SpecialClass() {
firstFunction();
}
~SpecialClass() {
secondFunction();
}
}
这样,您不需要解析C ++文件。由于您声明了一个全局变量,因此它的构造函数将在main
启动之前运行,其析构函数将在main
返回后运行。
缺点是你不了解你的全局构建时间与其他人相比的相对顺序。因此,如果您需要保证调用firstFunction
在整个程序中的其他任何构造函数之前,你运气不好。
答案 2 :(得分:2)
答案 3 :(得分:2)
在main()
的开头和main()
的末尾添加一个函数是一个坏主意。如果有人在中间拨打return
怎么办?
更好的想法是在main()
的开头实例化一个类,并让该类析构函数执行最后调用的调用函数。这将确保始终调用该函数。
答案 4 :(得分:1)
如果您可以控制您的主程序,您可以破解脚本来执行此操作,这是迄今为止最简单的方法。只需确保插入点是显而易见的(奇怪的注释,所需的令牌放置,您选择)和独特(包括禁止一般编码实践,如果您必须,以确保您需要的唯一性是真实的)。然后一个愚蠢的字符串黑客工具来读取源,找到唯一的标记,并插入您想要的调用将工作正常。
如果主程序的源代码来自其他来源,并且您没有控制权,那么为了做到这一点,您需要一个完整的C ++程序转换引擎。你不想自己构建它,因为只需要C ++解析器就可以做出巨大努力。其他人在这里提到了Clang和GCC作为答案。
另一种选择是我们的DMS Software Reengineering Toolkit及其C ++前端。 DMS使用其C ++前端,可以解析代码(用于各种C ++方言),构建AST,执行全名/类型解析以确定所有符号的含义/定义/使用。它提供了程序和源到源的转换,以启用AST的更改,并可以使用原始注释重新生成可编译的源代码。