C++-Funktionen können in C nur dann benutzt werden, wenn sie einen Typ haben, der auch in C darstellbar ist.
Je nachdem, ob die C++-Quelle verfügbar ist oder nicht, gibt es verschiedene Lösungen für die Funktionsverknüpfung.
Wenn die C++-Quelle zur Verfügung steht, kann die C++-Funktion dort mit extern "C"
deklariert werden. Die Funktion muss dann allerdings in allen C++-Quellen, die diese Funktion aufrufen, mit extern "C"
deklariert werden!
In der aufrufenden C-Quelle ist eine „normale“ extern
-Deklaration für die C++-Funktion erforderlich.
Wenn die C++-Quelle nicht zur Verfügung steht oder eine allgemeine Neu-Deklaration und Neu-Übersetzung nicht tragbar ist, kann eine zusätzliche Funktionsebene eingeschoben werden. In C++ wird eine sog. „Umhüllungsfunktion“ geschrieben und als extern "C"
definiert. Diese Umhüllungsfunktion kann dann in C ohne Einschränkungen aufgerufen werden.
Beispiel
Aufzurufende C++-Funktion:
int hidden(int i) { // ... }
Umhüllungsfunktion:
extern int hidden(int); extern "C" int wrapper(int i) { return hidden(i); }
C-Quelle, die die Umhüllungsfunktion aufruft:
extern int wrapper(int); int main(void) { printf("%d\n", wrapper(100)); return 0; }
Dieses Verfahren kann auch benutzt werden, wenn eine C++-Funktion einen Parameter enthält, dessen Typ nicht direkt einem C-Datentyp entspricht. Z.B. könnte für eine C++-Funktion mit einem Referenztyp-Parameter eine Umhüllungsfunktion mit einem Parameter vom Typ Zeiger geschrieben werden.