我正在寻找一个工具,正则表达式或其他魔法来做一些重型代码替换。
理想情况下,我可以通过调用保留参数的函数来替换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__
?
答案 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)