signal.h
我在/usr/include/sys/
我的mac上看到了这条线。基于它用作函数的返回类型signal
,我希望SIG_ERR
它是一个指向接受整数输入并返回 void 的函数的指针。但是 的宏扩展SIG_ERR
似乎从函数指针类型中减去 1,我觉得这很奇怪。C如何解析它?
#define SIG_ERR ((void (*)(int))-1)
( (void(*)(int)) -1)
不会从函数指针中减去 1,它所做的是将常量值 -1 转换为函数指针。
附带说明一下,在 ISO C 中不允许对函数指针进行加减运算,只能作为(有些特殊的)gcc 扩展来完成,它基本上将其处理为 char 指针;
在 GCC 中,允许对 void 类型的指针和指向函数的指针进行加法和减法运算。通常,ISO C 不允许对此类指针进行算术运算,因为“void”的大小是一个愚蠢的概念,并且取决于指针实际指向的内容。为了便于这种算术运算,GCC 将引用对象的大小视为一个字节。
在它的手册页上signal()
写道:
signal()函数返回信号处理程序的先前值,或SIG_ERR错误。
所以这个-1
“函数指针”只是一个错误指示值。
当然-1
,由于对齐限制,在大多数平台上从指针中减去是没有意义的。指针通常是 4 个字节的倍数。