用于Python的C++名称修饰库

13 投票
2 回答
7042 浏览
提问于 2025-04-16 20:33

我想在一个Python程序里处理C++函数的名称,也就是把它们搞乱和再搞回来。有没有这样的工具可以用呢?我搜索了好几个小时,希望在这里能找到答案...

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 传递一些参数。

把名字变得复杂是比较困难的,可能没有相关类型的定义就无法做到。

3

你可能不想在Python中这样做。顺便说一下,你可能也不应该从你的DLL中导出被修改过的名字,因为这会让使用不同编译器的人很难使用。

如果你必须使用被修改过的名字,那就直接在你的Python代码中写死这些名字。如果你真的想在Python代码中处理这些被修改的名字,你需要:

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

我觉得在Python中编写这些代码,效果可能还不如直接写死被修改过的名字来得好。

撰写回答