C链接传递给C库函数指针(C linkage for function pointer passed

2019-09-02 20:32发布

我的情况很简单:我想我的C ++程序来处理Unix的信号。 要做到这一点,提供的glibc在signal.h中调用的函数sigaction ,其期望接收一个函数指针作为它的第二个参数。

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"必要的联动符?

奖金的问题:可以uponSignal声明static

Answer 1:

我的问题是:是extern "C"必要的联动符?

为了最大的可移植性,是的; C ++标准只保证经由声明的函数以C互操作extern "C"

实际上,没有; 最明智的ABI(包括由glibc的使用的GNU ABI)将用于C和C ++非成员(和静态成员)相同功能的调用约定,使得extern "C"时,才需要共享语言之间的函数名。

奖金的问题:可以uponSignal声明为static?

是。 只需要外部链接从其他翻译单位名称访问该功能; 它没有必要通过一个函数指针调用的函数。



Answer 2:

extern C ,如果你从你的二进制文件导出的符号或从其他二进制导入(通常在两种情况下,共享库),为了避免名称重整才是必需的。

这里不是这种情况下,你不链接uponSignal在不同的二进制文件,所以你并不需要extern C 。 所有你正在做的是通过你的函数的地址sigaction从已经知道的功能uponSignal的地址,因为它们是同一个翻译单元(显然)的一部分,或者至少是相同的二进制的。

奖金的问题:可以uponSignal声明static

当然,如果你想。 uponSignal不需要外部链接反正。



文章来源: C linkage for function pointer passed to C library