2011-06-27 54 views
5

Đối số loại void (*)(int) không tương thích với tham số có kiểu __sighnd64_ttín hiệu xử lý trong C++

Dưới đây là mã đơn giản của tôi:

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

tôi đang làm việc trên OpenVMS. Tôi có thể tránh được lỗi biên dịch của một số kiểu đúc không? Trình biên dịch của tôi mong đợi `__sighnd64_t __64_signal (int, __sighnd64_t);

Thêm xung quanh trình xử lý extern c đã hoạt động. Cảm ơn

+0

Đó là lạ vì AFAIK '__sighnd64_t' được typedef'd cho 'void (*) (int)'. Nhưng có những vấn đề khác trong mã của bạn ... ví dụ 'cout' phải là số nhận dạng không khai báo vì bạn không sử dụng' std :: ' –

+0

Bạn có thể phải tìm trong tệp cho trình biên dịch của bạn (cái nào?) , để xem chính xác những gì nó mong đợi cho các tham số 'signal()'. –

+2

Xin lỗi vì câu hỏi có thể ngu ngốc, nhưng bạn có vấn đề biên dịch không? trên linux nó biên dịch và hoạt động, thêm đúng std :: khi cần thiết. – dave

Trả lời

3

xử lý tín hiệu không phải là một C++, nhưng một C. Lỗi này là hơi lạ ...

Trong trường hợp này, hãy thử sử dụng extern "C" xung quanh xử lý của bạn (để xác định nó như là chức năng C) , như https://stackoverflow.com/users/775806/n-m đã nói trong nhận xét. Hiện đại <signal.h> từ openvms đã có bên ngoài "C" bên trong: 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 chỉ về C chứ không phải C++.

Another doc nói rằng xử lý tín hiệu (catcher) phải được khai báo trong C như

void func(int signo); 
+3

Tôi không tin rằng bạn cần phải khai báo các hàm như 'extern" C "' để chúng được gọi từ mã C. Tôi nghĩ bạn chỉ cần làm điều này nếu họ được gọi bằng tên từ mã C. Vì một con trỏ tới trình xử lý tín hiệu đang được truyền, điều này có nghĩa là nó không cần phải được khai báo là 'extern" C "'. – Omnifarious

+0

Nhưng thêm extern "c" đã làm việc – Sam

+1

@Sam: Điều đó thật thú vị. Tôi tự hỏi, nếu quy ước gọi hàm sử dụng là một phần của loại trên hệ thống của bạn. – Omnifarious

Các vấn đề liên quan