传递给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
无论如何都不需要外部链接。