Besonderheiten von typeid.name() von GCC
Die Funktion typeid.name() wird oft verwendet, um Informationen über den Typ einer Variablen zu erhalten oder Ausdruck. Beim Kompilieren mit GCC wurde jedoch beobachtet, dass diese Funktion scheinbar unsinnige Zeichen anstelle des erwarteten entschlüsselten Typnamens zurückgibt. Dieses Verhalten steht im Gegensatz zu anderen Compilern wie Visual C, die eine klarere Darstellung bieten.
Der Grund für die Diskrepanz
Die Diskrepanz liegt in der Implementierung von typeid. name(), der durch die Implementierung des Compilers definiert wird. GCC gibt beispielsweise einen dekorierten Namen zurück, der zusätzliche Informationen über den Typ enthält, wie z. B. den Namen und die Signatur von Konstruktoren und Destruktoren.
Den dekorierten Namen entzerren
Um einen besser lesbaren Typnamen aus der dekorierten Zeichenfolge zu erhalten, können Sie Tools wie c filt oder __cxa_demangle verwenden. Diese Tools „entschlüsseln“ den dekorierten Namen, entfernen die zusätzlichen Informationen und hinterlassen den entschlüsselten Typnamen.
Beispiel: Entschlüsseln mit C-Filter
#include <iostream> #include <typeinfo> using namespace std; struct Blah {}; int main() { cout << c++filt::demangle(typeid(Blah).name()) << endl; return 0; }
Wann Wenn Sie diesen geänderten Code kompilieren und ausführen, erhalten Sie das gewünschte Ergebnis Ausgabe:
struct Blah
Fazit
Obwohl die Funktion typeid.name() von GCC anfänglich einen dekorierten Typnamen zurückgibt, ist es möglich, ihn zu entschlüsseln, um den entzerrten Typ zu erhalten Namen mithilfe von Tools wie C Filt oder __cxa_demangle. Wenn Sie die durch die Implementierung definierte Natur von typeid.name() verstehen, können Sie die gewünschten Typinformationen effektiv in Ihrem C-Code abrufen.
Das obige ist der detaillierte Inhalt vonWarum gibt „typeid.name()' von GCC unlesbare Namen zurück und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!