2012-04-12 8 views
24

Ich frage mich nur, warum Name Mangling wurde nie durch den C++ - Standard standardisiert. Offensichtlich schadet die Verwendung unterschiedlicher Namensverfälschungsalgorithmen der Interoperabilität [1], und ich sehe keinen Vorteil darin, sie implementationsdefiniert zu haben.Warum Name Mangling nicht standardisiert

Das heißt, im Gegensatz zu Aufrufkonventionen oder Größe von Primitiven ist die Maschine selbst egal oder weiß nicht einmal, wie die Funktion aufgerufen wird. Warum also war es nicht standardisiert und warum ist es immer noch nicht standardisiert? Compiler haben die Regeln in der Vergangenheit ohnehin zwischen den Versionen geändert.

[1] sprechen alle Leute, die Funktionen wie extern "C" exportieren, Bände.

+11

Der standardisierte Name Mangling dient nur dazu, Ihnen ein falsches Gefühl der Sicherheit zu geben, weil Sie auch die ABI standardisieren müssen, um die richtige Interoperabilität zu erhalten. Und das C++ - Standardkomitee dürfte nicht im ABI-Standardisierungsgeschäft vertreten sein. –

+3

+1 @Raymond - Lügen Sie sich über Interoperabilität ist schlechte Nachrichten überall. Es ist, als würde man sich auf undefiniertes Verhalten verlassen. Sicher, du * denkst * es funktioniert, aber es tut es wirklich nicht. –

+0

Richtig, ein C++ - ABI zu vereinbaren wäre viel schwieriger als für C.Leicht OT: Was genau in dieser Frage wird von 3 Leuten nicht als gut für SO gehalten? Schließlich existiert ganz klar eine gute eindeutige Antwort, wie bereits gezeigt. – Voo

Antwort

19

Der Standard behandelt Implementierungsdetails nicht. Es gibt viele, viele Dinge, die von der Implementierung abhängen, und die verhindern Programme zusammenarbeiten: wie die Klassen ausgelegt sind, die Struktur der vtable, etc. Im Allgemeinen werden Compiler die Namen Mangeln ändern, wenn sie ändere eines von diesen. Dies ist beabsichtigt, da es Code verhindert, die Verknüpfung nicht funktionieren würde.

Es ist für eine gegebene Plattform möglich, einen C++ ABI zu definieren; Alle Compiler , die sich daran halten, würden kompatible Implementierungen verwenden und einen gemeinsamen Namen Mangling haben. Dies ist ein Problem für die Plattformanbieter, jedoch; Aus irgendwelchen Gründen haben nur wenige Anbieter eine C++ - ABI definiert.

Und der Grund extern "C" funktioniert, weil fast alle Plattformen einen C ABI definieren.

+2

Es sollte hinzugefügt werden, dass, selbst wenn Mangling standardisiert wurde," extern "C sowieso benötigt würde, weil C macht keinen Mangel und C++ muss überladene Funktionen unterstützen, daher sind die Symbole in jedem Fall anders. –

+3

@JanHudec Es ist nicht wirklich gut definiert was "extern" C "bedeutet. Was bedeutet es auf einer Plattform, die beispielsweise keinen C-Compiler hat? In der Praxis jedoch definieren die meisten, wenn nicht alle Plattformen einen C ABI, und "extern" C bedeutet, sich daran zu halten. Und auch hier ist der Name Mangling nicht das einzige Problem. Ich habe auf Plattformen gearbeitet, auf denen die Auftragsvariablen auf den Stack geschoben wurden, und zwar zwischen C und C++. (Auch die meisten der C-Compiler, die ich verwendet habe, machen Mangelnamen. Einfacher als C++.) –

15

Der Standard erfordert keine Namensänderung. Aus diesem Grund erfordert der Standard keine IEEE-Fließkommazahlen oder Zweierkomplement-Ganzzahlen oder eine beliebige Anzahl anderer Dinge.

Bis es war ein weit verbreitetes ABI es sich verlassen konnte, GCC actually went out of its way to use a different name mangling scheme als seine Konkurrenten:

G ++ tun nicht Namen in der gleichen Weise wie andere C++ Compiler Mangeln. Dies bedeutet, dass Objektdateien, die mit einem Compiler kompiliert wurden, nicht mit anderen Compilern verwendet werden können.

Dieser Effekt ist beabsichtigt, um Sie vor subtileren Problemen zu schützen. Compiler unterscheiden sich hinsichtlich vieler interner Details der C++ - Implementierung, einschließlich: wie Klasseninstanzen angeordnet sind, wie Mehrfachvererbung implementiert ist und wie virtuelle Funktionsaufrufe gehandhabt werden. Wenn die Namenscodierung gleich gemacht würde, würden Ihre Programme mit Bibliotheken verbunden sein, die von anderen Compilern bereitgestellt werden - aber die Programme würden dann beim Ausführen abstürzen. Inkompatible Bibliotheken werden dann zur Verbindungszeit und nicht zur Laufzeit erkannt.

Name Mangling ist auch komplexer, als viele Programmierer realisieren. Wie würde beispielsweise der Standard acceptable calling conventions for all platforms that C++ could run on spezifizieren? Sollte ein RISC-System erforderlich sein, um x86 stdcall zu unterstützen, obwohl RISC-Systeme ihre Argumente normalerweise in Registern anstatt auf dem Stapel übergeben?

Verwandte Themen