SIG_ERR

时间:2015-07-05 03:31:31

标签: c++ casting signals

使用带有g++ (gcc version 4.2.1 20070719)标志的-Wold-style-cast(特定的OpenBSD 5.6)编译某些C ++代码时,我遇到了一些旧式的强制转换警告,我发现一些信号处理程序代码我不确定演员阵容正在发生。

MCVE:

// compile with g++ file.cpp -Wold-style-cast
#include <iostream>
#include <csignal>

typedef void (*sighndlr)(int);

void sig_handler(int sig)
{
    std::cout << "got sig: " << sig << std::endl;
}

int main(int argc, char* argv[])
{
    // warning: use of old-style cast
    sighndlr sh = SIG_ERR;

    // warning: use of old-style cast
    void (*sigerr1)(int) = SIG_ERR;

    // warning: use of old-style cast
    void (*sigerr2)(int) = static_cast<void(*)(int)>(SIG_ERR);

    // warning: use of old-style cast
    void (*sigerr3)(int) = reinterpret_cast<void(*)(int)>(SIG_ERR);

    // warning: use of old-style cast
    if (std::signal(SIGABRT, sig_handler) == SIG_ERR) {
        std::cout << "error install SIGABRT" << std::endl;
    }

    // no errors or warnings
    if (std::signal(SIGTERM, sig_handler) == sigerr1) {
        std::cout << "error install SIGTERM" << std::endl;
    }
    // no errors or warnings
    std::signal(SIGSEGV, sig_handler);

    // This was just to confirm SIG_ERR wasn't some weird definition
    // error: invalid conversion from 'void (*)(int)' to 'void* (*)(int)'
    // void* (*e0)(int) = SIG_ERR;
    return 0;
}

警告没有引起任何问题,我认为void (*sigerr2)(int) = static_cast<void(*)(int)>(SIG_ERR) -Wold-style-cast标志上的解析错误过于谨慎,但我更好奇为什么它会给我一个警告在std::signal(SIGABRT, sig_handler) == SIG_ERR而非std::signal(SIGTERM, sig_handler) == sigerr1

1 个答案:

答案 0 :(得分:1)

警告不是因为您的代码,而是<signal.h>中定义了SIG_ERR的警告。我现在没有Linux发行版进行检查,但快速谷歌发现了这个:

#if defined(_ANSI_SOURCE) || defined(__cplusplus)
#define SIG_DFL     (void (*)(int))0
#define SIG_IGN     (void (*)(int))1
#define SIG_ERR     (void (*)(int))-1
#else
#define SIG_DFL     (void (*)())0
#define SIG_IGN     (void (*)())1
#define SIG_ERR     (void (*)())-1
#endif

显然已明确实施,但我确定如果你发现<signal.h>,你会发现类似的东西。