C++中的信号处理

Sam*_*Sam 5 c++ signal-handling openvms

类型的void (*)(int)参数与类型的参数不兼容__sighnd64_t

下面是我的简单代码:

#include <iostream>
#include <string>
#include <signal.h>
#include <ctype>
#include <stdlib.h>
#include <stdio.h>
typedef struct mystrcut
{

  int a;
  char *b;

} mystr;

void set_string ( char **, const char * );
void my_handler(int s)
{
    printf("Caught signal %d\n",s);
    exit(1);

}

int main()
{
    const std::string str1[] = {"hello1", "hello2"};
    char str2[50];
    size_t size1 = str1[1].size();
    cout << size1;
    memcpy (str2, str1[1].c_str(), size1);

    cout << str2;
    mystr *m = NULL;
    m = new mystrcut;
    m->a = 5;

    set_string(&m->b, "hello");

    cout << m->b;
    delete []m->b;
//    void (*prev_fn)(int);
    signal (SIGINT,my_handler);
    return 0;
}
void set_string ( char **a, const char *b)
{
    *a = new char [strlen(b)+1];
    strcpy (*a, b);
}
Run Code Online (Sandbox Code Playgroud)

我正在开发openvms.我可以通过某种类型转换来避免编译错误吗?我的编译器需要`__sighnd64_t __64_signal(int,__sighnd64_t);

添加处理程序extern c已经有效了.谢谢

osg*_*sgx 4

信号处理不是 C++,而是 C。这个错误有点奇怪......

在这种情况下,请尝试在处理程序周围使用 extern "C" (将其定义为 C 函数),如/sf/users/54306451/在评论中所述。来自openvms的现代<signal.h>已经在里面有extern“C”:http://wasd.vsm.com.au/conan/sys$common/syslib/decc$rtldef.tlb ?key=SIGNAL&title=Library%20/sys$common/syslib /decc$rtldef.tlb&referer=http%3A/wasd.vsm.com.au/conan/sys$common/syshlp/helplib.hlb

HP文档只提到了 C,而不是 C++。

另一篇文档说信号处理程序(捕手)必须在 C 中声明为

 void func(int signo);
Run Code Online (Sandbox Code Playgroud)

  • 我不认为您需要将函数声明为“extern "C"”才能从 C 代码调用它们。我认为只有在 C 代码中按名称引用它们时才需要执行此操作。由于传递的是指向信号处理程序的指针,这意味着不需要将其声明为“extern“C””。 (3认同)
  • @Omnifarious:这在标准语言中称为“语言链接”,它*是*类型的一部分(具有不同语言链接的两个函数类型是不同的类型,即使它们在其他方面相同 - C++03 7.5 IIRC)。一些编译器使 C 和 C++ 函数类型兼容,无论好坏。 (2认同)