从函数指针中减去1

时间:2013-07-11 04:31:34

标签: c linux signals

我在Mac上signal.h的{​​{1}}中看到了这一行。基于它用作函数/usr/include/sys/的返回类型,我希望signal是一个指向函数的指针,该函数接受整数输入并返回void。但是SIG_ERR的宏扩展似乎从函数指针类型中减去1,我发现这很奇怪。 C如何解析它?

SIG_ERR

2 个答案:

答案 0 :(得分:7)

( (void(*)(int)) -1)  

不会从函数指针中减去1,它所做的是强制将常量值-1传递给函数指针。

作为附注,在ISO C中不允许在函数指针中添加或减去,并且只能执行as a (somewhat peculiar) gcc extension,它基本上处理它就像它是一个char指针一样;

  

在GCC中,允许在void类型的指针和函数指针上进行加法和减法操作。通常,ISO C不允许对这样的指针进行算术运算,因为“void”的大小是一个愚蠢的概念,并且取决于指针实际指向的内容。为了便于这种算术,GCC将参考对象的大小视为一个字节。

答案 1 :(得分:1)

the manual page of signal()上显示:

  

signal()函数返回信号处理程序的先前值,或者出错时 SIG_ERR

所以这个-1'函数指针'只是一个错误指示符值。

当然,由于对齐限制,从指针中减去-1在大多数平台上没有意义;指针通常是4个字节的倍数。