C++ Name Mangling

Da Andreabont's Wiki.

Il C++ necessita di una particolare convenzione per gestire il nome delle chiamate a livello di linker, in quanto la presenza di namespace e la possibilità di sovraccaricare metodi e funzioni può causare dubbi su quale porzione di codice si vuole effettivamente chiamare. Ogni compilatore implementa una sua convenzione, quella che verrà qui spiegata è la convenzione standard di GCC e CLANG.

Codifica

Il nome di una funzione C++, per convenzione, si divide in 3 parti principali:

  1. La stringa iniziale "_Z" che identifica una funzione C++ secondo questa convenzione.
  2. Il nome della funzione o del metodo preceduto dalla sua lunghezza in numero. Se è necessario specificare dei namespace, vanno posti prima del nome, preceduti dalla lunghezza in numero, e tutta questa sequenza deve essere compresa tra i caratteri "N" e "E".
  3. Una sequenza di simboli ad indicare i tipi base accettati come parametro.

Codifica dei tipi base

Simbolo Tipo
c char
i int
l long
v void

Codifica di puntatori ed array

Per codificare un puntatore di un tipo o un array di un certo tipo è necessario preporre la lettera "P" al simbolo del tipo.

Codifica di un tipo definito dall'utente

Nel caso di un tipo definito dall'utente, questo sarà posto con il suo nome completo, preceduto dalla sua lunghezza in numero.

Esempi

Funzioni base

Prototipo Codifica Descrizione
void funzione_base();
_Z13funzione_basev
Funzione base senza parametri
void funzione_mista(int a, char b);
_Z14funzione_mistaic
Funzione con due parametri in ingresso, un intero e un carattere.
void funzione_array(int a[]);
_Z14funzione_arrayPi
Funzione con un parametro, array di interi.
void funzione_pointer(char* a);
_Z16funzione_pointerPc
Funzione con un parametro, puntatore ad un carattere.
void funzione_classe(miaClasse a);
_Z15funzione_classe9miaClasse
Funzione con un parametro, classe definita dall'utente.

Funzioni dentro un namespace

Prototipo Codifica Descrizione
void mioNamespace::miaFunzione(miaClasse a);
_ZN12mioNamespace11miaFunzioneE9miaClasse
Funzione dentro un namespace che accetta una classe definita dall'utente.
void miaClasse::mioMetodo();
_ZN9miaClasse9mioMetodoEv
Metodo di una classe. Nessun parametro.