0

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

#define SIG_ERR         ((void (*)(int))-1)  
4

2 回答 2

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

不会从函数指针中减去 1,它所做的是常量值 -1 转换为函数指针。

附带说明一下,在 ISO C 中不允许对函数指针进行加减运算,只能作为(有些特殊的)gcc 扩展来完成,它基本上将其处理为 char 指针;

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

于 2013-07-11T04:35:14.273 回答
1

在它的手册页上signal()写道:

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

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

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

于 2013-07-11T05:20:42.240 回答