Domanda

Ho bisogno di utilizzare l'indirizzo di un membro di una classe template in g ++ in linea di montaggio (come valore costante in fase di compilazione). E 'possibile esprimere questo? (Penso che ho bisogno il nome storpiato di T<U>::x).

template < typename U >
struct T {
  static int x;
};

template < typename U >
void f () {
  asm ("somecommand T<U>::x");
}
È stato utile?

Soluzione

Supponendo che si sta usando Linux, è possibile utilizzare nm.

nm --demangle foo.o ti dà i nomi demangled per i simboli foo.o nm --no-demangle ti dà i nomi alterati per i simboli.

Quindi è possibile confrontare l'output di questi 2 file per abbinare il nome storpiato il nome demangled.

Altri suggerimenti

userei objdump per estrarre il nome storpiato da un oggetto quali sono le referenze (è possibile utilizzare c++filt ad andare nella direzione opposta, ma non conosco nessun programma autonomo dando il nome storpiato, si potrebbe utilizzare la specifica http://www.codesourcery.com/public/cxx-abi/abi.html e crea un mangler o fare il mangling manualmente, ma questo è probabilmente eccessivo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top