C ++名称Mangling Library for Python

时间:2011-06-29 19:59:32

标签: c++ python name-mangling

我想在Python程序中修改和解码C ++函数名。 有没有这样的东西?我现在搜索了几个小时,也许我很幸运...

2 个答案:

答案 0 :(得分:20)

如果你想要解构名称,例如。为了显示,你可以创建一个运行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'])

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

管理名称要困难得多,如果不了解相关类型的定义,可能无法完成。

答案 1 :(得分:3)

你很可能不想在Python中这样做。另外,您可能不应该从DLL中导出损坏的名称,因为它使得很难用于具有不同编译器的任何人。

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

  1. 了解相关编译器的具体实施规则。
  2. 在Python中指定每个函数的C ++函数签名。
  3. 对我而言,用Python编写所有这些内容似乎不如简单地对受损的名称进行硬编码更好。