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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow