013
21.01.2004, 09:39 Uhr
virtual
Sexiest Bit alive (Operator)
|
Du musst unterscheiden zwischen C und C++ Linkage.
Erstmal das einfache: In C gibt es immer nur einfache Funktionen. Diese Funktionen sind durch ihren Namen eindeutig bestimmt. Wenn ich eine Funktion
C++: |
void function(char*) { ... }
|
habe, dann ist der Name function eindeutig; insbesondere kann es in C nicht eine weitere Funktion mit gleichen Namen und anderen parametern geben. In C++ schon: Da ist der Funktionsname nicht eindeutig, sondern nur die Kombination Funktion+Typen der Parameterliste. Langer Rede, kurzer Sinn: In C genügt der Name einer Funktion und dieser name wird bei C Linkage auch einfach in der DLL vermerkt, und zwar so wie er ist.
In C++ sieht es deutlich komlizierter aus: Zum einen Kann man funktionen überladen:
C++: |
void function(char*) { ... } void function(int) { ... }
|
Beide Funktionen mögen zwar gleich heissen, haben aber unterschiedliche Parameter (einmal char*, zum anderen int). Dh wenn man mit C++ Linkage arbeitet, reicht es nicht aus, allein den Namen der Funktion in der DLL zu kodieren, sondern man muß auch die Parametertypen irgendwie an den namen dranhängen. hinzu kommen eben noch klassen, dann muß in den Methodennamen noch vermerkt werden, zu welcher Klasse sie gehören. Dies führt zu diesen kryptischen Namen wie "??0!Sample@@QAE@ABV0@@Z.". Die Funktion/Methode wird wohl irgendwas mit der Klasse "Sample" zu tun haben, vermutlich ein Constructor, weil man keinen expliziten Methodennamen sieht. Die komichen Zeichen dienen dazu, die Parametertypen zu spezifizieren. Alles in Allem nennt man diese Namensbildung "Namemangling", also das Vermatschen von den funktionsnamen in irgendwas, was eben auch die Parameter beschreibt. Das kernproblem: 1. namemangling ist nicht Standardisiert, dh. unterschiedliche Linker produzieren unterschiedliche Namen was dazu führt, das DLLs nicht untereinander kompatibel sein können. 2. Unter Windows ist mir kein tool bekannt, welches einen gemanglten Namen in Klartext umwandeln könnte; unter UNIX schon (nm heißt es dort).
Bei Klassen wirst Du nicht darum kommen, DLLs mit gemanglten Namen zu haben; bei Normalen funktionen, solange du sie nicht überlädst (also gleiche Funktionsnamen mit unterschiedlichen parametern verwendest) kannst Du Namemangling verhindern, indem du mit extern "C" C-Linkage erzwingst. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |