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.