传递给C库的函数指针的C链接

我的情况非常简单:我希望我的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"链接说明符是否必要?

奖金问题:onSignal可以声明为static吗?

我的问题是: extern "C"链接说明符是否必要?

为了最大程度的便携性,是的; C ++标准仅通过声明为extern "C"函数保证与C的互操作性。

实际上,没有; 最明智的ABI(包括glibc使用的GNU ABI)将对C和C ++非成员(和静态成员)函数使用相同的调用约定,因此只需要extern "C"来共享语言之间的函数名称。

奖金问题: uponSignal可以声明为静态吗?

是。 只需要通过其他翻译单位的名称访问该function,就需要外部链接; 没有必要通过函数指针调用该函数。

只有从二进制文件中导出符号或从另一个二进制文件(通常在两种情况下都是共享库)中导入符号时,才需要使用extern C ,以避免名称损坏。

这不是这种情况,你没有在各种二进制文件上链接到uponSignal ,所以你不需要extern C 您所做的就是将函数的地址传递给已经知道uponSignal地址的函数的sigaction ,因为它们(显然)是同一个翻译单元的一部分,或者至少是同一个二进制文件的一部分。

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

当然,如果你想。 uponSignal无论如何都不需要外部链接。