使用带有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
?
答案 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>
,你会发现类似的东西。