私のケースはかなりシンプルです。私のC++プログラムはUnixシグナルを処理したいと思っています。そうするために、glibcはsignal.hの中で関数ポインタを第2引数として受け取ることを期待するsigaction
という関数を提供しています。関数ポインタが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);
}
私の質問は:extern "C"
リンケージ指定子は必要なのか?
ボーナスの質問:シグナルはstatic
と表示されますか?
一部のコンパイラは、 'extern" C "'を削除するとコンパイルすることを単に拒否します。これは、sigactionの第2引数が間違った型を持つためです。多くのコンパイラでは、関数型のリンケージ部分を考慮していないバグです。 –