信号系统调用可以与类的C++静态成员一起使用吗?

2 c c++ unix linux signals

*nix平台是否支持以下内容?

    #include <cstdio>
    #include <sys/types.h>
    #include <signal.h>
    #include <unistd.h>

    class SignalProcessor
    {
     public:
      static void OnMySignal(int sig_num)
      {
          printf("Caught %d signal\n", sig_num);
          fflush(stdout);

          return;
      } 
    }; 
    using namespace std;

   int main()
   {

          signal(SIGINT,SingalProcessor::OnMySignal);
          printf("Ouch\n");

          pause();

          return 0;
   }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ork 5

技术上没有你不能.

您恰好很幸运,您的编译器正在使用与"C"函数相同的调用约定.由于没有定义C++ ABI,下一版本的编译器可以自由地使用完全不同的调用约定,这将使您的代码混乱,而不会发出编译器的警告.

请参阅:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2
请参阅本节末尾的注释

注意:静态成员函数不需要调用实际对象,因此指向静态成员函数的指针通常与常规指向函数类型兼容.然而,虽然它可能适用于大多数编译器,但它实际上必须是一个外部的"C"非成员函数才能正确,因为"C链接"不仅包括名称修改等内容,还包括调用约定,可能在C和C++之间有所不同.

编辑:
回答Sasha的评论:

以线程为例:

#include <iostream>
class Thread
{    public:   virtual void run()  = 0; };

extern "C" void* startThrerad(void* data)
{
    Thread*  thread = reinterpret_cast<Thread*>(data);
    try
    {
        thread->run();
    }
    catch(...)
    {    /* Log if required. Don't let thread exit with exception. */ }
    return NULL;
}
class MyJob: public Thread
{
    public: virtual void run() {std::cout << "HI\n";}
};
int main()
{
    MyJob     job; // MyJob inherits from Thread
    pthread_t th;

    // In most situation you do not need to dynamic cast.
    // But if you use multiple inheritance then things may get
    // interesting, as such best to always use it.
    pthread_create(&th,NULL,startThrerad,dynamic_cast<Thread*>(&job));

    void*     result;
    pthread_join(th,&result);
}
Run Code Online (Sandbox Code Playgroud)