我有一个非常古老的大型x86项目,现在我需要将其移植到x64架构。不幸的是,混合int/memsize类型会导致很多错误。例如:
std::vector<T> vec;
for(int i = 0; i < vec.size(); ++i) // error, i must be size_t
{
}
因此,我想要的是用将int更改为size_t来替换所有这样的字符串。从形式上讲,问题可以表述如下:
查找符合以下条件的字符串:
for(int [var name] = 0; [var name] < [container name].size(); [any expression])
替换为:
for(size_t [var name] = 0; [var name] < [container name].size(); [any expression])
我使用的是visualstudio2008。我正在寻找这个问题最正确的解决方案。非常感谢。
查找内容的Regex:for[:bn]*([:bn]*int[:bn]+{:i}[:bn]*=[:bn]*0[:bn]*;[:bn]*{:i}[:bn]*<[:bn]*{:i}.size[:bn]*([:bn]*);[:bn]*
替换为:for(size_t 1 = 0; 2 < 3.size();
(注意结束空格)
"最正确的解决方案"可能包括使用理解C++语法的解析器,然后在操作解析树后使用该解析器重写代码。C++语法并不简单,对于这样的任务,除非项目特别大,否则你很可能不得不恢复使用在大多数情况下有效的东西,而不是技术上正确的东西。
最简单的方法可能是编写一组搜索/替换正则表达式来完成这项工作,正则表达式近似于可能的用例,但从下面的示例中可以看出,正则表达式可能很难阅读。
这里有一个用Python编写的实用程序,它近似于你想要做的事情。它将在stdin或命令行上获取一个文件,并在stdout上生成转换后的文本。正则表达式严格匹配相同的标识符。
#!/usr/bin/env python
import fileinput
import sys
import re
regex = re.compile(
r"""(?P<start>^s*fors*( # Leading for construct
)(?P<type>int)(?P<remainder>s+(?P<identifier>[A-Za-z_][0-9A-Za-z]*) # int type followed by identifier
s*=s*0s*; # Matches '= 0;'
s*(?P=identifier)s*<s*(?P<container>[A-Za-z_][0-9A-Za-z]*).size(); # ident < container.size();
[^)]*).*$)""",
re.VERBOSE)
for line in fileinput.input():
line = line.rstrip()
match_object = regex.match(line)
if match_object is not None:
line = match_object.expand('g<start>size_tg<remainder>')
print line