2011-06-29 13 views
6

Chciałbym zmienić nazwy funkcji C++ w programie Python. Czy jest coś takiego dostępnego? Szukałem już wiele godzin, może mam szczęście tutaj ...C++ Name Mangling Library for Python

+5

Łamanie nazw jest zależne od implementacji. Który kompilator Cię interesuje? –

+0

co masz na myśli przez mangle/demangle? –

Odpowiedz

3

Najprawdopodobniej nie chcesz tego robić w Pythonie. Na marginesie prawdopodobnie nie powinno się eksportować zniekształconych nazw z plików DLL, ponieważ sprawia to trudność w użyciu dla każdego z innym kompilatorem.

Jeśli musisz używać zniekształconych nazw, po prostu napisz je w swoim kodzie Pythona. Jeśli masz zamiar zrobić manewrowanie w kodzie Pythona, musisz:

  1. Znać zasady dotyczące konkretnych implementacji dla danego kompilatora.
  2. Określ w Pythonie podpis funkcji C++ dla każdej funkcji.

Wydaje mi się wysoce nieprawdopodobne, że kodowanie tego w Pythonie byłoby lepsze, niż po prostu trudne kodowanie zniekształconych nazw.

+0

Dzięki, właśnie dodałem 'extern" C "' i teraz nazwa funkcji wygląda dobrze! – manuels

+0

@manuels Excellent! Eksportowanie zniekształconych nazw z biblioteki DLL lub obiektu współużytkowanego powoduje wiele problemów i zgadzam się, że 'extern" C "' jest rozwiązaniem. –

16

Jeśli chcesz zminimalizować nazwy, np. do wyświetlenia, możesz utworzyć potok z 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']) 

Możesz podać argumenty do C++ filt, jeśli potrzebujesz użyć określonej metody demangling.

Mangling nazwy jest znacznie trudniejszy i prawdopodobnie nie da się tego zrobić bez znajomości definicji typów.

+0

Które kompilatory obsługuje C++ filt? –

+0

@David: [Spójrz na dokumenty] (http://sourceware.org/binutils/docs-2.16/binutils/c_002b_002bfilt.html) dla opcji '-s' lub' --format'. –

+0

Przynajmniej z nowszym pythonem musisz użyć stdout.decode() zanim zrobisz split() – mcsim