Trường hợp của tôi khá đơn giản: Tôi muốn chương trình C++ của tôi xử lý các tín hiệu Unix. Để làm như vậy, glibc cung cấp một hàm trong signal.h gọi là sigaction
, mà hy vọng sẽ nhận được một con trỏ hàm làm đối số thứ hai của nó.C liên kết cho con trỏ hàm được chuyển đến thư viện 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);
}
Câu hỏi của tôi là: là extern "C"
bộ định danh liên kết cần thiết?
Câu hỏi tiền thưởng: có thể sau khiSignal được khai báo static
?
Một số trình biên dịch sẽ đơn giản từ chối biên dịch nó nếu bạn loại bỏ 'extern" C "' bởi vì đối số thứ hai cho sigaction có kiểu sai. Nó là một lỗi trong nhiều trình biên dịch mà họ không xem xét phần liên kết của loại hàm. –