qdi*_*dii 8 c c++ signals glibc linkage
我的情况非常简单:我希望我的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 );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:extern "C"链接说明符是否必要?
奖金问题:可以申报onSignal static吗?
我的问题是:
extern "C"链接说明符是否必要?
为了最大程度的便携性,是的; C++标准仅保证通过声明的函数与C的互操作性extern "C".
实际上,没有; 最敏感的ABI(包括glibc使用的GNU ABI)将对C和C++非成员(和静态成员)函数使用相同的调用约定,因此extern "C"只需要在语言之间共享函数名称.
奖金问题:可以
uponSignal声明为静态吗?
是.只有从其他翻译单位按名称访问该功能才需要外部链接; 没有必要通过函数指针调用函数.
extern C仅当您从二进制文件导出符号或从另一个二进制文件(通常在这两种情况下都是共享库)导入符号时才需要这样做,以避免名称损坏。
在这里情况并非如此,您没有uponSignal跨各种二进制文件链接,因此不需要extern C. 您所做的就是将函数的地址传递给sigaction已经知道 的地址的函数uponSignal,因为它们(显然)是同一翻译单元的一部分,或者至少是同一二进制文件的一部分。
加分问题:可以
uponSignal申报static吗?
当然,如果你愿意的话。uponSignal无论如何都不需要外部链接。
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |