c++中的信号:使用成员函数

signal in C++: using a member function

本文关键字:成员 函数 信号 c++      更新时间:2023-10-16

我对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()函数期望被传递(隐藏的)this形参来指向对象的某个实例。由于信号机制不知道这个(或c++的任何东西),您需要使用static函数,这样就没有隐藏的this参数。

我可以告诉你怎么回事:

不能像普通函数指针那样使用非静态成员函数。成员函数总是有一个隐式的this参数,该参数由调用方(隐式)提供。C API不能这样做。

Terminate必须是类中的静态函数

成员函数与不属于任何类的普通函数具有不同的签名。但是,静态成员函数与普通函数具有相同的签名。因此,您可以在GOOBER类中将terminate成员函数声明为静态。