【发布时间】:2011-09-25 11:19:18
【问题描述】:
我想在 Python 程序中对 C++ 函数名称进行破坏和分解。 有没有类似的东西?我现在搜索了几个小时,也许我在这里很幸运......
【问题讨论】:
-
名称修改是特定于实现的。你对哪个编译器感兴趣?
-
你所说的 mangle/demangle 是什么意思?
标签: c++ python name-mangling
我想在 Python 程序中对 C++ 函数名称进行破坏和分解。 有没有类似的东西?我现在搜索了几个小时,也许我在这里很幸运......
【问题讨论】:
标签: c++ python name-mangling
如果您想对名称进行分解,例如。为了显示,你可以创建一个运行 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 指定参数。
修改名称要困难得多,而且在不知道所涉及类型的定义的情况下可能无法完成。
【讨论】:
-s 或--format 选项。
您很可能不想在 Python 中执行此操作。顺便说一句,您可能不应该从您的 DLL 中导出损坏的名称,因为它很难用于具有不同编译器的任何人。
如果您必须使用错位名称,则只需在 Python 代码中硬编码即可。如果你打算在 Python 代码中进行修改,那么你必须:
在我看来,用 Python 编写所有这些代码似乎不太可能比简单地硬编码损坏的名称更好。
【讨论】:
extern "C",现在函数名看起来不错!
extern "C" 是解决方案。