extern "C" legt fest, wie Symbole in der generierten Objektdatei benannt werden sollen. Wenn eine Funktion ohne extern "C" deklariert wird, wird der Symbolname in der Objektdatei C++ - Name Mangling verwenden. Hier ist ein Beispiel.
Gegeben test.c etwa so:
void foo() { }
Kompilieren und Auflistung Symbole in der Objektdatei gibt:
$ g++ -c test.C
$ nm test.o
0000000000000000 T _Z3foov
U __gxx_personality_v0
Die foo Funktion tatsächlich "_Z3foov" genannt wird. Diese Zeichenfolge enthält unter anderem Typinformationen für den Rückgabetyp und die Parameter. Wenn Sie stattdessen test.c wie folgt schreiben:
extern "C" {
void foo() { }
}
Dann kompilieren und Symbole aussehen:
$ g++ -c test.C
$ nm test.o
U __gxx_personality_v0
0000000000000000 T foo
Sie C-Bindung erhalten. Der Name der "foo" -Funktion in der Objektdatei ist nur "foo", und sie hat nicht alle Informationen über die Phantasie, die von der Namensänderung kommt.
Normalerweise fügen Sie einen Header in extern "C" {} ein, wenn der dazugehörige Code mit einem C-Compiler kompiliert wurde, aber Sie versuchen, ihn aus C++ aufzurufen. Wenn Sie dies tun, sagen Sie dem Compiler, dass alle Deklarationen in der Kopfzeile die C-Verknüpfung verwenden. Wenn Sie Ihren Code verknüpfen, enthalten Ihre O-Dateien Verweise auf "foo", nicht "_Z3fooblah", die hoffentlich mit dem übereinstimmt, was in der Bibliothek vorhanden ist, mit der Sie verlinken.
Die meisten modernen Bibliotheken werden Wächter um solche Header legen, so dass Symbole mit der richtigen Verknüpfung erklärt werden. z.B. in vielen der Standard-Header finden Sie:
#ifdef __cplusplus
extern "C" {
#endif
... declarations ...
#ifdef __cplusplus
}
#endif
Dies stellt sicher, dass, wenn C++ Code enthält den Header, die Symbole in Ihrer Objektdatei übereinstimmen, was in der C-Bibliothek ist. Sie sollten nur extern "C" {} um Ihren C-Header legen müssen, wenn es alt ist und diese Wächter noch nicht haben.
Ich bin verwirrt, was Sie in Ihrer Frage Titel meinen ... können Sie erarbeiten? –
Ich bin mir nicht sicher, wie ich es anders ausdrücken soll. Hast du über den Titel hinaus gelesen? – Landon