简体   繁体   中英

C linkage for function pointer passed to C library

My case is pretty simple: I want my C++ program to deal with Unix signals. To do so, glibc provides a function in signal.h called sigaction , which expects to receive a function pointer as its second argument.

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 );
}

My question is: is the extern "C" linkage specifier necessary?

Bonus question: can uponSignal be declared static ?

My question is: is the extern "C" linkage specifier necessary?

For maximum portability, yes; the C++ standard only guarantees interoperability with C via functions declared extern "C" .

Practically, no; most sensible ABIs (including the GNU ABI used by glibc) will use the same calling convention for C and C++ non-member (and static member) functions, so that extern "C" is only needed to share the function name between languages.

Bonus question: can uponSignal be declared static?

Yes. External linkage is only needed to access the function by name from other translation units; it's not necessary to call the function via a function pointer.

extern C is only necessary if you export your symbols from your binary or import them from another binary (typically in both cases, a shared library), in order to avoid name mangling.

Here this is not the case, you're not linking uponSignal across various binaries so you don't need extern C . All you're doing is pass your function's address to sigaction from a function that already knows uponSignal 's address since they are (apparently) part of the same translation unit, or at the very least of the same binary.

Bonus question: can uponSignal be declared static ?

Sure if you want. uponSignal doesn't need external linkage anyway.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM