C++ — Änderungen 7791 → 7831

Zeile 166: Zeile 166:
 
=== C++ Funktionen aus C/Assembler nutzen ===
 
=== C++ Funktionen aus C/Assembler nutzen ===
 
Um C++ Funktionen von Sourcecode, der in C oder Assembler geschrieben ist, aufrufen zu können, muss das ''name mangling'' - dabei werden die Funktionsnamen nicht direkt als Symbolnamen genommen, sondern Parameter- und Rückgabetypen und Informationen zum Namespace mit in den Symbolnamen eingebaut - deaktivieren für diese Funktion. Dies geschieht dadurch, dass die betreffende Funktion innerhalb des C++-Sourcecodes ''extern "C"'' deklariert wird, wie in folgendem Beispiel:
 
Um C++ Funktionen von Sourcecode, der in C oder Assembler geschrieben ist, aufrufen zu können, muss das ''name mangling'' - dabei werden die Funktionsnamen nicht direkt als Symbolnamen genommen, sondern Parameter- und Rückgabetypen und Informationen zum Namespace mit in den Symbolnamen eingebaut - deaktivieren für diese Funktion. Dies geschieht dadurch, dass die betreffende Funktion innerhalb des C++-Sourcecodes ''extern "C"'' deklariert wird, wie in folgendem Beispiel:
−
<cpp>
+
<cpp>extern "C" void foobar(int i, char* s);</cpp>
−
extern "C" void foobar(int i, char* s);
 
−
</cpp>
 
 
Anschließend kann die Funktion in C++ ganz normal definiert werden und schließlich aus dem C/Assembler-Sourcecode heraus wie sonst üblich aufgerufen werden.
 
Anschließend kann die Funktion in C++ ganz normal definiert werden und schließlich aus dem C/Assembler-Sourcecode heraus wie sonst üblich aufgerufen werden.
 +
 +
Eine Einschränkung gibt es aber doch: man kann diese Funktion nicht mehr überladen, das würde beim Linken zu ernsten Problemen führen.
 +
Folgendes Beispiel funktioniert also nicht:
 +
<cpp>extern "C" void foobar(int i, char* s);
 +
extern "C" void foobar(int i, double* d);</cpp>
 +
Der Linker würde 2 Funktionen mit dem Namen 'foobar' finden und könnte das ganze nicht mehr linken und auch nicht feststellen welche Funktion die Aufrufer jeweils meinen.
  
 
=== designated initializers ===
 
=== designated initializers ===