![](/img/trans.png)
[英]Assigning {pointer to function with C linkage} to {pointer to function with C++ linkage} and vice versa
[英]C linkage for function pointer passed to C library
我的情况非常简单:我希望我的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
可以声明为静态吗?
是。 只有从其他翻译单位按名称访问该功能才需要外部链接; 没有必要通过函数指针调用函数。
只有从二进制文件中导出符号或从另一个二进制文件(通常在两种情况下,共享库)中导入符号时,才需要使用extern C
,以避免名称损坏。
这不是这种情况,你没有在各种二进制文件上链接到uponSignal
,所以你不需要extern C
您所做的就是将函数的地址传递给已经知道uponSignal
地址的函数的sigaction
,因为它们(显然)是同一个翻译单元的一部分,或者至少是同一个二进制文件的一部分。
奖金问题:
uponSignal
可以声明为static
吗?
当然,如果你想。 uponSignal
无论如何都不需要外部链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.