1

我正在寻找一种工具、正则表达式或其他魔法来进行一些繁重的代码替换。

理想情况下,我可以通过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__在重载的 new 中添加?

4

2 回答 2

2

您没有提到为什么要这样做,但我确实想知道重载 new 运算符是否对您来说是一个更好的选择。

为什么要替换默认的 new 和 delete 运算符?

编辑

以下链接也可能是相关的:

在 C++ 中重载 new 和 delete

覆盖有关调用者的“新”和记录数据

替换 C++ 运算符 new 的宏

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

似乎这是许多人以前解决过的问题。谷歌搜索overload|override new __line__ __file__将引发更多可能性。

于 2013-01-31T08:25:42.500 回答
1

您的一些更可行的选择:

如果只有几个文件,您可以简单地在 IDE 中浏览它们并使用 CTRL+H 查找和替换(谢谢 Mark Garcia)

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

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

从命令行运行此命令将在当前目录中的每个 .cpp 文件中用新字符串替换旧字符串的所有实例。老实说,如果您只是用另一个字符串替换所有 'new' 实例,这可能是许多文件最直接的方法。尽管这种情况不太可能发生,但您始终可以将旧字符串更改为您想要的任何内容(例如将“新对象”替换为 createObject)

于 2013-01-31T07:52:26.140 回答