0

我有一个非常古老的大型 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])

我正在使用 Visual Studio 2008。我正在寻找最正确的解决方案来解决这个问题。谢谢你。

4

2 回答 2

1

查找内容的正则表达式:for[:b\n]*\([:b\n]*int[:b\n]+{:i}[:b\n]*=[:b\n]*0[:b\n]*;[:b\n]*{:i}[:b\n]*\<[:b\n]*{:i}\.size[:b\n]*\([:b\n]*\);[:b\n]*

替换为:(for(size_t \1 = 0; \2 < \3.size();注意结尾空格)

于 2012-08-23T11:55:36.450 回答
0

“最正确的解决方案”可能涉及使用理解 C++ 语法的解析器,然后在操作解析树后使用该解析器重写代码。C++ 语法并不简单,对于这样的任务,除非项目特别大,否则您很可能不得不恢复使用在大多数情况下有效的东西,而不是在技术上正确。

最简单的方法可能是编写一组搜索/替换正则表达式来完成这项工作,正则表达式近似于可能的用例,但从以下示例中可以看出,正则表达式可能难以阅读.

这是一个用 Python 编写的实用程序,它近似于您正在尝试做的事情。它将在标准输入或命令行上获取一个文件,并在标准输出上生成转换后的文本。正则表达式严格匹配相同的标识符。

#!/usr/bin/env python

import fileinput
import sys
import re

regex = re.compile(
    r"""(?P<start>^\s*for\s*\(  # 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*0\s*;  # 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_t\g<remainder>')
    print line
于 2012-08-23T12:39:14.003 回答