2011-06-29 86 views
6

我想在Python程序中對C++函數名稱進行修改和取消處理。 有沒有類似的東西可用?我現在搜索了幾個小時,也許我在這裏很幸運......C++名稱用於Python的Mangling庫

+5

名稱修改是特定於實現的。你對哪個編譯器感興趣? –

+0

mangle/demangle是什麼意思? –

回答

3

你很可能不希望在Python中這樣做。另外,你可能不應該從你的DLL中導出重名的名字,因爲它使得使用不同編譯器的人很難使用它。

如果您必須使用重名的名稱,那麼只需在您的Python代碼中對其進行硬編碼。如果您打算在Python代碼中進行修改,那麼您必須:

  1. 瞭解有關編譯器的實現特定規則。
  2. 在Python中指定每個函數的C++函數簽名。

對我來說,在Python中對所有這些代碼進行編碼似乎不太可能比對簡單名稱進行硬編碼更好。

+0

謝謝,我剛加了'extern「C」',現在函數名看起來很好! – manuels

+0

@manuels優秀!從DLL或共享對象導出重名的名稱會導致很多問題,我同意'extern「C」'是解決方案。 –

16

如果您想取消名稱,例如。用於顯示,那麼你可以創建一個運行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指定參數。

處理名稱要困難得多,如果不知道所涉及類型的定義,可能無法完成。

+0

哪些編譯器支持C++ filt? –

+0

@David:[查看文檔](http://sourceware.org/binutils/docs-2.16/binutils/c_002b_002bfilt.html)用於'-s'或'--format'選項。 –

+0

至少使用較新的python,你需要在使用stdout.decode()之前執行split() – mcsim