当前位置: 技术问答>linux和unix
在类中使用signal编译不通过
来源: 互联网 发布时间:2016-03-01
本文导语: 为什么下面的代码不能通过编译呢?提示错误: error: argument of type `void (CTest::)(int)' does not match `void (*)(int)' 代码如下: void CTest::handle_signal(int s) { printf("ctrl+cn"); exit(1); } void CTest::initsignal() { signal(SIGINT, hand...
为什么下面的代码不能通过编译呢?提示错误:
error: argument of type `void (CTest::)(int)' does not match `void (*)(int)'
代码如下:
void CTest::handle_signal(int s)
{
printf("ctrl+cn");
exit(1);
}
void CTest::initsignal()
{
signal(SIGINT, handle_signal);
}
void CTest::start()
{
initsignal();
init();
}
但是把代码改成handle_signal移出类CTest就可以通过,并且运行正常,这是为什么呢,不移出类的话,我试过很多改动都不行,请高手指点一下,谢谢.
void handle_signal(int s)
{
printf("ctrl+cn");
exit(1);
}
void CTest::initsignal()
{
signal(SIGINT, handle_signal);
}
void CTest::start()
{
initsignal();
init();
}
error: argument of type `void (CTest::)(int)' does not match `void (*)(int)'
代码如下:
void CTest::handle_signal(int s)
{
printf("ctrl+cn");
exit(1);
}
void CTest::initsignal()
{
signal(SIGINT, handle_signal);
}
void CTest::start()
{
initsignal();
init();
}
但是把代码改成handle_signal移出类CTest就可以通过,并且运行正常,这是为什么呢,不移出类的话,我试过很多改动都不行,请高手指点一下,谢谢.
void handle_signal(int s)
{
printf("ctrl+cn");
exit(1);
}
void CTest::initsignal()
{
signal(SIGINT, handle_signal);
}
void CTest::start()
{
initsignal();
init();
}
|
因为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的类成员函数。
类的成员函数与类的个数相关,比如:定义
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的类成员函数。
|
signal的处理函数必须使用C声明的函数. 类的肯定不行, 不过可以试试static的静态类函数.