请建议一个可以自动替换的工具,如:
Mutex staticMutex = Mutex(m_StaticMutex.Handle());
staticMutex.Wait();
到
boost::unique_lock<boost::mutex> lock(m_StaticMutex);
如您所见,必须考虑这些论点。有没有比正则表达式简单的方法?
答案 0 :(得分:3)
如果你可以通过适量的手工工作(甚至包括“搜索和替换”)来做到这一点,那么这个答案是无关紧要的。
如果代码变化太大(缩进,注释,不同的变量名称),并且有很多这些,您可能需要一个Program Transformation工具。这些工具倾向于在程序表示(如抽象语法树)上运行,因此不会因布局或空格或甚至由于基数而拼写不同的数字而烦恼,但实际上具有相同的值。
我们的DMS Software Reengineering Toolkit就是其中之一,并且有一个C++ Front End。
你需要给它一个重写规则,如下所示:
domain Cpp; -- tell DMS to use the C++ front end for parsing and prettyprinting
rule replace_mutex(i:IDENTIFIER):statements -> statements
"Mutex \i = Mutex(m_StaticMutex.Handle());
\i.Wait();" =>
"boost::unique_lock<boost::mutex> lock(m_StaticMutex);";
在两个地方使用元变量 \ i 将确保只有在两个地方的名称完全相同时才会触发规则。
我不清楚你要完成的是什么;看起来你想要用一个全局互斥替换每个私有互斥,但我不是一个助推专家。如果你试图这样做,我希望你的程序行为不同。
答案 1 :(得分:0)
如果这些行频繁出现在您的代码中,类似格式化,只是使用不同的变量名称,但不是“太”频繁(<200~300次),我建议您使用具有记录重放功能的编辑器(对于示例Windows下的Visual Studio)。记录用新的替换2行的步骤(但保留变量名称)。然后根据需要重复“搜索Mutex
” - “重播宏”。
当然,任何具有良好“文件中查找和替换”功能的文本编辑器都可以同时解决所有出现的特定情况。