首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

在类中使用signal编译不通过,该怎么解决

2012-02-23 
在类中使用signal编译不通过为什么下面的代码不能通过编译呢?提示错误:error:argumentoftype`void(CTest::

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

热点排行