2011-06-27 255 views
5

void (*)(int)类型的参数与__sighnd64_tC++中的信号处理

类型的参数不兼容

下面是我的简单代码:

#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); 
} 

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

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

+0

这是奇怪,因为据我所知'__sighnd64_t'被typedef定义为'无效(*)(INT)'。但是在你的代码中还有其他的问题......例如'cout'必须是一个未声明的标识符,因为你不使用'std ::' –

+0

你可能必须在文件中寻找你的编译器(哪一个?) ,以确切地看到它对'signal()'参数的期望。 –

+2

对不起,也许愚蠢的问题,但你有编译问题?在Linux上编译和工作,在需要的地方添加正确的std ::。 – dave

回答

3

的信号处理是不是C++,但C.此错误是有点奇怪......

在这种情况下,尽量使用外部的“C”在你的处理程序(将其定义为C函数) ,因为https://stackoverflow.com/users/775806/n-m在评论中表示。来自openvms的现代<signal.h>已经具有外部“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 docs says只关于C,而不是C++。

Another doc说,信号处理器(捕手)必须在C语言中声明为

void func(int signo); 
+3

我不相信你需要将函数声明为'extern“C”',以便根据C代码调用它们。我认为你只需要通过C代码中的名称来引用它。由于指向信号处理程序的指针正在被传递,这意味着它不需要被声明为“extern”C“'。 – Omnifarious

+0

但添加extern“c”已经工作 – Sam

+1

@Sam:这很有趣。我想知道是否使用的函数调用约定是系统类型的一部分。 – Omnifarious