加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的信号:使用成员函数

发布时间:2020-12-16 06:48:53 所属栏目:百科 来源:网络整理
导读:我有signal()的这个问题: 这段代码很好编译: #include stdio.h#include stdlib.h#include signal.hvoid terminate( int param ){ printf ( "Terminating program...n" ); exit( 1 );}int main(){ signal( SIGTERM,terminate ); return 0;} 但是,以下代码
我有signal()的这个问题:

这段代码很好编译:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void terminate( int param )
{
  printf ( "Terminating program...n" );
  exit( 1 );
}

int main()
{
    signal( SIGTERM,terminate );
    return 0;
}

但是,以下代码会引发此错误:

g++ -Wall -c -g goober.cpp
goober.cpp: In member function `void GOOBER::yarrgh()':
goober.cpp:5: error: argument of type `void (GOOBER::)(int)' does not match `
   void (*)(int)'
make: *** [goober.o] Error 1

goober.h:

#ifndef GOOBER_H
#define GOOBER_H

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

using namespace std;

class GOOBER {
public:
    GOOBER(){}
    ~GOOBER(){}
    void yarrgh();
    void terminate( int param );
};

#endif

goober.cpp:

#include "goober.h"

void GOOBER::yarrgh()
{
    signal( SIGTERM,terminate );
}

void GOOBER::terminate( int param )
{
    printf( "Terminating program...n" );
    exit( 1 );
}

driver.cpp:

#include "goober.h"

using namespace std;

int main()
{
    GOOBER G;
    G.yarrgh();

    return 0;
}

我没有看到代码中的任何差异,除了我在成员中调用signal().任何想法有什么不对,以及如何解决它?

解决方法

您需要将terminate()函数声明为static:

class GOOBER {
    // ...
    static void terminate(int param);
};

这是因为作为非静态成员函数,terminate()函数期望传递(隐藏)此参数以指向该对象的某个实例.由于信号机制不知道这个(或者关于C的任何东西),你需要使用静态函数,这样就没有隐藏的这个参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读