((void (*)(int))-1) 是什么意思?

9
我刚发现这个内容。
// /usr/include/sys/signal.h // OS X
#define SIG_ERR ((void (*)(int))-1)

“((void (*)(int))-1)”是什么意思?

和其他的有何区别?

#define SIG_ERR -1

?


3
请查看这个链接,它讨论了在信号处理代码中将整数转换为函数指针的做法,解释了为什么这种做法可以工作。 - LPs
2个回答

8

这被转换为一个函数指针:

((type) value)

其中type是void (*)(int),它是一个指向接受一个int参数并返回void的函数的指针,实际上它是信号处理程序的签名:

typedef void (*sighandler_t)(int);

你可以使用 cdecl 工具或网站进行这些类型的解码:http://cdecl.org/

抱歉,但cdecl说了这个 - Sourav Ghosh
嗯,@SouravGhosh,你是对的,cdecl说这里有一个错误,但是据我看来,myaut是完全正确的:)。猜测cdecl在这种类型的转换上失败了。 - Guillaume Munsch
3
@LeZohan68,我从未说过myaut是错误的,只是指出在某些情况下使用cdecl并不太可靠。 - Sourav Ghosh
1
cdecl在-1处中断,但它可以很好地解析(void (*)(int)) - myaut
2
@myaut 是的,它可以接受变量名,而不是值。我发表这个评论只是为了确保任何试图复制粘贴确切指令并出现错误的人不会感到困惑。希望你不介意。 :-) - Sourav Ghosh
显示剩余2条评论

2

将-1转换为函数指针,其类型应为SIG_ERR。直接使用-1在编译器需要正确类型的情况下无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接