在类中使用signal编译不通过
为什么下面的代码不能通过编译呢?提示错误:
error: argument of type `void (CTest::)(int) ' does not match `void (*)(int) '
代码如下:
void CTest::handle_signal(int s)
{
printf( "ctrl+c\n ");
exit(1);
}
void CTest::initsignal()
{
signal(SIGINT, handle_signal);
}
void CTest::start()
{
initsignal();
init();
}
但是把代码改成handle_signal移出类CTest就可以通过,并且运行正常,这是为什么呢,不移出类的话,我试过很多改动都不行,请高手指点一下,谢谢.
void handle_signal(int s)
{
printf( "ctrl+c\n ");
exit(1);
}
void CTest::initsignal()
{
signal(SIGINT, handle_signal);
}
void CTest::start()
{
initsignal();
init();
}
[解决办法]
signal的处理函数必须使用C声明的函数. 类的肯定不行, 不过可以试试static的静态类函数.
[解决办法]
因为signal的处理函数只能有一个,否则的话就不知道到底要调用哪个函数了。
类的成员函数与类的个数相关,比如:定义
CTest a,b,就会有2个void CTest::handle_signal(int s)。
你编程序时希望类a调用a的handle_signal,类b调用b的handle_signal,但系统没这么聪明。
说复杂点,其实以上的说法不完全正确,具体实现时,a和b的handle_signal地址是相同的,但隐藏了一个pThis的指针,使用single时,造成参数不统一。
而static函数仅有一份,也不包含隐藏的pThis的指针参数。
总而言之,single对应的必须是普通函数或static的类成员函数。