13

我想在 Python 程序中对 C++ 函数名称进行处理和拆解。有没有类似的东西?我现在搜索了几个小时,也许我在这里很幸运......

4

2 回答 2

22

如果你想对名称进行分解,例如。为了显示,您可以创建一个运行 c++filt 的管道。

def demangle(names):
    args = ['c++filt']
    args.extend(names)
    pipe = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    stdout, _ = pipe.communicate()
    demangled = stdout.split("\n")

    # Each line ends with a newline, so the final entry of the split output
    # will always be ''.
    assert len(demangled) == len(names)+1
    return demangled[:-1]

print demangle(['_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode',
    '_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci'])

如果您需要使用特定的解组方法,可以为 c++filt 指定参数。

修改名称要困难得多,如果不知道所涉及类型的定义,可能无法完成。

于 2011-06-29T20:26:25.350 回答
3

您很可能不想在 Python 中执行此操作。顺便说一句,您可能不应该从您的 DLL 中导出损坏的名称,因为它很难用于具有不同编译器的任何人。

如果您必须使用错位名称,那么只需在您的 Python 代码中对它们进行硬编码。如果您要在 Python 代码中进行修改,那么您必须:

  1. 了解相关编译器的实现特定规则。
  2. 在 Python 中为每个函数指定 C++ 函数签名。

在我看来,用 Python 编写所有这些代码似乎不太可能比简单地对损坏的名称进行硬编码更好。

于 2011-06-29T20:08:11.207 回答