- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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/
使用 g++ (gcc version 4.2.1 20070719) 编译一些 C++ 代码时(具体为 OpenBSD 5.6)与 -Wold-style-cast标志,我遇到了一些信号处理程序代码
在有如下定义: #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1 我
我是一名优秀的程序员,十分优秀!