任何好的C++;可以处理此场景的重构工具 我有一个大的C++代码库,它包含了我计划重写的错误日志的几个函数,定义如下:p> void LogError(ErrorLevel elvl,LPCTSTR Format,...); // Literal version void LogError(ErrorLevel elvl,UINT ResourceID,...); // Resource version
我打算把它们作为一个函数重写任何好的C++;可以处理此场景的重构工具 我有一个大的C++代码库,它包含了我计划重写的错误日志的几个函数,定义如下:p> void LogError(ErrorLevel elvl,LPCTSTR Format,...); // Literal version void LogError(ErrorLevel elvl,UINT ResourceID,...); // Resource version,c++,refactoring,C++,Refactoring,我打算把它们作为一个函数重写 void LogError(ErrNo No,...); 在本例中,ErrNo是一个枚举,用于从外部文件中查找其余错误详细信息。虽然我正在使用和喜爱视觉辅助,但它似乎不能满足这种需求。我认为执行重构最简单的方法是编写一个小程序,使用搜索输出的结果来查找此函数的所有出现的情况,例如 c:\cpp\common\Atlas\Comps\LSADJUST.cpp LSAFormNormalEquations (174): LogError(
void LogError(ErrNo No,...);
在本例中,ErrNo是一个枚举,用于从外部文件中查找其余错误详细信息。虽然我正在使用和喜爱视觉辅助,但它似乎不能满足这种需求。我认为执行重构最简单的方法是编写一个小程序,使用搜索输出的结果来查找此函数的所有出现的情况,例如
c:\cpp\common\Atlas\Comps\LSADJUST.cpp
LSAFormNormalEquations (174): LogError(elvl_Error,IDS_WINWRN0058,i+1,TravObs.setup_no,TravObs.round_no
LSAFormNormalEquations (180): LogError(elvl_Error,IDS_WINWRN0059,i+1,TravObs.setup_no,TravObs.round_no
LSAFormNormalEquations (186): LogError(elvl_Error,IDS_WINWRN0060,i+1,TravObs.setup_no,TravObs.round_no
c:\cpp\common\Atlas\Comps\LSADJUSTZ.CPP
LSAFormNormalEquationsZ (45): LogError(elvl_Note,_T("Adjusting heights by least squares"));
c:\cpp\Win32\Atlas\Section\OptmizeSectionVolumes.cpp
OnSectionOptimizeVolumes (239): LogError(elvl_Note,"Shifted section at chainage %0.1lf by %0.3lf",Graph.c1,Offset);
然后解析并修改源代码。有没有其他工具可以为我简化这项任务?如果看一眼,你会发现外面没有多少东西。我不介意花一小笔钱买一个相当容易使用的工具,但我没有时间或预算做更多的事情。如果您使用Unix,使用
sed
编辑所有源代码可能会处理大部分更改。您必须手工完成一些更改。我过去曾使用过这种技术。四处寻找满足我需求的轻量级产品是一片空白,而学习SED虽然有价值,但对于一些不能完全解决我问题的产品来说,可能是相当多的工作。我最终编写了自己的工具,在代码库的一个单独副本上执行所需的重构,直到我很高兴它正是我所需要的。这涉及从visualassists的findallreferences选项获取输出,并使用它重构代码库。我会发布代码,但目前的情况非常糟糕,在不同的代码库下可能会失败。一般问题可以这样说
- 对于C++代码库,找出函数FN的每一个出现参数,A,B,…n/LI>
- 从源文件中删除出现的fn
- 将参数提取为文本变量
- 添加更多变量,如实例号、源文件名等
- 在删除fn时,编写一个包含可用变量的格式化字符串
- 将类似格式的字符串附加到一个或多个外部文件(例如资源文件等)
编辑:对于任何感兴趣的人,都会有一些后续信息。一次搜索会产生多少点击率?在这种情况下,我经常发现全局搜索加上VS宏已经非常有用了。@sbi-1217 hits。这足以保证编写一点代码而不是手动执行。特别是考虑到我手动完成这类工作的注意力持续时间较短;)如果您有一个输出窗口列出了所有这些内容,您可以使用快捷方式(对于我来说是
F4
),从一个到另一个,然后使用另一个(Ctrl+Shift+P
,对于我来说,您可以将F4
一个合并到宏中)。我认为这很简单。我想我做过比这个更糟糕的替换。我用Codewright的正则表达式搜索和替换做过类似的事情。但是要定期备份,因为一次输入就很容易破坏整个代码集:-)@Tony:如果没有VCS的备份,我不敢这样做。你可以在Windows上使用cygwin或MSYS进行备份。@sbi是的,但是一个纯粹的Windows程序员可能不知道如何使用它们。安装cygwin并学习如何使用多个Unix程序执行一次重构有点太多了。确实如此。然而,通常情况下,你可以问一位同事。我一直都是这么做的<代码>:)或powershell,这是免费的,在Windows7中是默认的。