C++
Koppelingsspecificaties
Zoeken…
Invoering
Een koppelingsspecificatie vertelt de compiler om declaraties te compileren op een manier die het mogelijk maakt om ze te koppelen aan declaraties geschreven in een andere taal, zoals C.
Syntaxis
- extern string-literal { laration-seq ( opt )}
- externe string-letterlijke verklaring
Opmerkingen
De standaard vereist dat alle compilers extern "C"
ondersteunen om C ++ compatibel te maken met C, en extern "C++"
, die kunnen worden gebruikt om een bijgevoegde koppelingsspecificatie te overschrijven en de standaard te herstellen. Andere ondersteunde koppelingsspecificaties zijn door de implementatie bepaald .
Signaalhandler voor Unix-achtig besturingssysteem
Aangezien een signaalhandler door de kernel wordt aangeroepen met behulp van de C-aanroepconventie, moeten we de compiler vertellen de C-aanroepconventie te gebruiken bij het compileren van de functie.
volatile sig_atomic_t death_signal = 0;
extern "C" void cleanup(int signum) {
death_signal = signum;
}
int main() {
bind(...);
listen(...);
signal(SIGTERM, cleanup);
while (int fd = accept(...)) {
if (fd == -1 && errno == EINTR && death_signal) {
printf("Caught signal %d; shutting down\n", death_signal);
break;
}
// ...
}
}
Een C-bibliotheekkop compatibel maken met C ++
AC bibliotheek header kan meestal worden opgenomen in een C ++ programma, aangezien de meeste verklaringen zowel in C als C ++ geldig zijn. Overweeg bijvoorbeeld de volgende foo.h
:
typedef struct Foo {
int bar;
} Foo;
Foo make_foo(int);
De definitie van make_foo
wordt afzonderlijk gecompileerd en gedistribueerd met de kop in objectvorm.
Een C ++ programma kan #include <foo.h>
, maar de compiler weet niet dat de make_foo
functie is gedefinieerd als een C symbool, en zal waarschijnlijk proberen er naar te zoeken met een verminkte naam, en zal het niet vinden. Zelfs als het de definitie van make_foo
in de bibliotheek kan vinden, gebruiken niet alle platforms dezelfde make_foo
voor C en C ++, en de C ++ compiler gebruikt de C ++ make_foo
bij het aanroepen van make_foo
, wat waarschijnlijk een segmentatiefout veroorzaakt als make_foo
verwacht te worden gebeld met de C-conventie.
De manier om dit probleem op te lossen, is om bijna alle verklaringen in de header in een extern "C"
-blok te wikkelen.
#ifdef __cplusplus
extern "C" {
#endif
typedef struct Foo {
int bar;
} Foo;
Foo make_foo(int);
#ifdef __cplusplus
} /* end of "extern C" block */
#endif
Wanneer foo.h
is opgenomen in een C-programma, verschijnen het gewoon als gewone verklaringen, maar wanneer foo.h
is opgenomen in een C ++ -programma, zal make_foo
zich in een extern "C"
-blok bevinden en zal de compiler weten te zoeken een niet-veranderde naam en gebruik de C-conventie.