2015-06-08 23 views
9

Ho appena trovato questo.Che cosa significa ((void (*) (int)) - 1)?

// /usr/include/sys/signal.h // OS X 
#define SIG_ERR ((void (*)(int))-1) 

Cosa significa ((void (*)(int))-1) parte?

E 'diverso da

#define SIG_ERR -1 

?

+3

Dai un'occhiata a [QUESTO] (http://stackoverflow.com/questions/8419483/casting-integer-to-function-pointer-in-signal-code-why-does-this-work) – LPs

risposta

8

questo è gettato a una funzione-pointer:

((type) value) 

Dove tipo è void (*)(int) che è puntatore a funzione di accettare una int argomento e tornare void, che è in realtà è una firma di un gestore di segnale:

typedef void (*sighandler_t)(int); 

Si può decodificare tali tipi con cdecl utensile o sito web: http://cdecl.org/

+0

scusa, ma [ cdecl dice questo] (http://cdecl.ridiculousfish.com/?q=%28%28void+%28*%29%28int%29%29-1%29). –

+0

Bene @SouravGhosh, hai ragione, cdecl dice che c'è un errore, ma in realtà, myaut è totalmente corretto secondo me x). Indovina che cdecl non funziona su quel tipo di cast –

+0

@SouravGhosh; Ecco perché suggerisco alle persone di non usare cdecl. – haccks

2

Questo è un cast di -1 nel puntatore della funzione che è previsto come il tipo di SIG_ERR. L'utilizzo di -1 direttamente non funziona in situazioni in cui il compilatore ha bisogno del tipo corretto.