日期:2014-05-16  浏览次数:20619 次

在类中使用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的类成员函数。