2011-06-27 50 views
5

argumento de tipo void (*)(int) es incompatible con el parámetro de tipo __sighnd64_tmanejo de señales en C++

A continuación es mi código simple:

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

estoy trabajando en OpenVMS. ¿Puedo evitar el error de compilación por algún tipo de conversión de tipo? Mi compilador espera `__sighnd64_t __64_signal (int, __sighnd64_t);

Adición de alrededor del manipulador externo c ha funcionado. Gracias

+0

Eso es extraño, porque yo sepa '__sighnd64_t' se typedef'd a' void (*) (int) '. Pero hay otros problemas en su código ... por ejemplo 'cout' debe ser un identificador no declarado, ya que no usar' 'std :: –

+0

es probable que tenga que buscar en el archivo para su compilador (¿cuál?) , para ver exactamente lo que espera de los parámetros 'signal()'. –

+2

Disculpa por la pregunta tal vez estúpida, pero ¿tienes un problema de compilación? en linux compila y funciona, agregando correctamente std :: donde sea necesario. – dave

Respuesta

3

manejo de señales no es un C++, pero una C. Este error es poco extraño ...

En tales casos, intente utilizar extern "C" alrededor de su manejador (a definirlo como función C) , como https://stackoverflow.com/users/775806/n-m dijo en los comentarios. Modern <signal.h> de openvms ya tiene extern "C" inside: 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 sólo alrededor de C, no es un C++.

Another doc dice que el manejador de señales (receptor) debe ser declarado en C como

void func(int signo); 
+3

No creo que necesite declarar funciones como 'extern' C "' para que puedan ser llamadas desde el código C en absoluto. Creo que solo necesitas hacer esto si se les menciona por nombre desde el código C. Dado que se está pasando un puntero al manejador de señal, esto significa que no necesita ser declarado 'extern "C" '. – Omnifarious

+0

Pero agregar extern "c" ha funcionado – Sam

+1

@Sam: Eso es interesante. Me pregunto si la convención de llamadas a función que se usa es parte del tipo en su sistema. – Omnifarious