gpt4 book ai didi

SIG_ERR 上的 C++ 旧式转换警告

转载 作者:行者123 更新时间:2023-11-28 06:11:13 24 4
gpt4 key购买 nike

使用 g++ (gcc version 4.2.1 20070719) 编译一些 C++ 代码时(具体为 OpenBSD 5.6)与 -Wold-style-cast标志,我遇到了一些信号处理程序代码的旧式强制转换警告,我不确定强制转换在哪里发生。

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

最佳答案

警告不是因为您的代码,而是在 <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

它显然是实现定义的,但我敢肯定,如果你 grep 你的 <signal.h>你会发现类似的东西。

关于SIG_ERR 上的 C++ 旧式转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31226910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com