【问题标题】:Automatic source code replacement自动源代码替换
【发布时间】:2013-01-31 07:44:01
【问题描述】:

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

理想情况下,我可以通过调用保留参数的函数来替换 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 会发生什么?如何在重载的 new 中添加 __FILE__

【问题讨论】:

  • 你能给我们举个输入输出的例子吗?
  • 呃,Ctrl+H 在大多数 IDE 中都支持正则表达式。
  • 什么操作系统?你用什么代码编辑器?
  • 祝你好运,用正则表达式匹配括号...

标签: c++


【解决方案1】:

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

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__ 将引发更多可能性。

【讨论】:

  • @Inuart 您还没有说 Debug 函数的作用,但是(以我有限的知识)我看不出重载 new 不可行的任何明显原因。这不是我自己做过的事情。仔细研究链接中的信息,看看它是否适用于您的案例。
  • 我最初的想法是使用宏来跟踪一些附加信息,如__FILE__,将其存储在标准容器中,然后调用new。如果容器调用new会发生什么?如何在重载的new 中添加__FILE__
  • 好问题。我对此没有答案。有人吗?
【解决方案2】:

一些更可行的选择:

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

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

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

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

【讨论】:

  • 我如何用正则表达式添加最后的)
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多