Il mio caso è piuttosto semplice: voglio che il mio programma C++ gestisca i segnali Unix. Per fare ciò, glibc fornisce una funzione in signal.h chiamata sigaction
, che si aspetta di ricevere un puntatore di funzione come secondo argomento.C collegamento per il puntatore di funzione passato alla libreria C
extern "C"
{
void uponSignal(int);
}
void uponSignal(int)
{
// set some flag to quit the program
}
static
void installSignalHandler()
{
// initialize the signal handler
static struct sigaction sighandler;
memset(&sighandler, 0, sizeof(struct sigaction));
sighandler.sa_handler = uponSignal;
// install it
sigaction(SIGINT, &sighandler, nullptr);
}
La mia domanda è: è l'identificatore extern "C"
legame necessario?
Domanda bonus: può suSignal essere dichiarato static
?
Alcuni compilatori semplicemente rifiuteranno di compilarlo se si rimuove 'extern" C "' perché il secondo argomento di sigaction ha il tipo sbagliato. In molti compilatori è un bug che non considerano la parte di collegamento del tipo di funzione. –