我有这个问题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;
}
Run Code Online (Sandbox Code Playgroud)
但是,以下代码会引发此错误:
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
Run Code Online (Sandbox Code Playgroud)
#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
Run Code Online (Sandbox Code Playgroud)
#include "goober.h"
void GOOBER::yarrgh()
{
signal( SIGTERM, terminate );
}
void GOOBER::terminate( int param )
{
printf( "Terminating program...\n" );
exit( 1 );
}
Run Code Online (Sandbox Code Playgroud)
#include "goober.h"
using namespace std;
int main()
{
GOOBER G;
G.yarrgh();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我没有看到代码有什么不同,除了我signal()在一个成员中打电话.任何想法有什么不对,以及如何解决它?
Gre*_*ill 14
您需要将您的terminate()函数声明为static:
class GOOBER {
// ...
static void terminate(int param);
};
Run Code Online (Sandbox Code Playgroud)
这是因为作为非静态成员函数,terminate()函数期望传递(隐藏)this参数以指向对象的某个实例.由于信号机制不知道这个(或者关于C++的任何内容),你需要使用一个static函数,这样就没有隐藏的this参数.