自动源代码替换

时间:2013-01-31 07:44:02

标签: c++

我正在寻找一个工具,正则表达式或其他魔法来做一些重型代码替换。

理想情况下,我可以通过调用保留参数的函数来替换new运算符的所有实例。

我有什么选择?

更新

示例:

ClassA* a = new ClassA<int>(1,2,3,4,new ClassB(1,2),"horrible");

应转换为:

ClassA* a = FUNCTION(ClassA<int>(1,2,3,4,FUNCTION(ClassB(1,2)),"horrible"));

FUNCTION将执行以下操作:

FUNCTION(...) Debug(new __VA_ARGS__, __FILE__)

一个简单的替换几乎做得很好,它只缺少最后一个)

更新

我最初的想法是使用宏来跟踪一些其他信息,如__FILE__,将其存储在std容器中,然后调用new。如果容器调用new会发生什么?如何在重载的新内容中添加__FILE__

2 个答案:

答案 0 :(得分:2)

您没有提到为什么要这样做,但我确实想知道重载新运算符是否适合您。

Why would one replace default new and delete operators?

修改

以下链接也可能相关:

overloading new and delete in c++

Overriding "new" and Logging data about the caller

Macro to replace C++ operator new

http://blogs.msdn.com/b/calvin_hsia/archive/2009/01/19/9341632.aspx

这似乎是许多人以前解决过的问题。谷歌搜索overload|override new __line__ __file__将进一步增加可能性。

答案 1 :(得分:1)

一些更可行的选择:

如果它只是几个文件,你只需在IDE中浏览它们并使用CTRL + H查找和替换(谢谢Mark Garcia)

如果它是很多文件,你可以编写一个Perl脚本来查找和替换正则表达式(我建议使用Perl只是因为我发现正则表达式非常简单)这可以在一行中实现

perl -p -i -e 's/oldstring/newstring/g' `find ./ -name *.cpp`

从命令行运行此命令将在当前目录的每个.cpp文件中用newtring替换oldstring的所有实例。老实说,如果你只是用另一个单独的字符串替换'new'的所有实例,这可能是许多文件最直接的方式。虽然这种情况不太可能发生,但你可以随时将旧字符串更改为你想要的任何内容(比如说'new Object'替换为createObject)