8

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

奖励问题:可以声明 onSignalstatic吗?

4

2 回答 2

6

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

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

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

额外的问题:可以uponSignal声明为静态的吗?

是的。外部链接只需要从其他翻译单元通过名称访问功能;不必通过函数指针调用函数。

于 2013-05-13T11:53:57.797 回答
3

extern C仅当您从二进制文件中导出符号或从另一个二进制文件(通常在这两种情况下,共享库)中导入符号时才需要,以避免名称修改。

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

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

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

于 2013-05-13T11:45:59.607 回答