C 从函数指针中减去1
我在mac上的C 从函数指针中减去1,c,linux,signals,C,Linux,Signals,我在mac上的/usr/include/sys/中的signal.h中看到了这一行。基于它用作函数signal的返回类型,我希望SIG_ERR是一个指向接受整数输入并返回void的函数的指针。但是SIG_ERR的宏扩展似乎从函数指针类型中减去了1,我觉得这很奇怪。C如何解析它 #define SIG_ERR ((void (*)(int))-1) 不会从函数指针中减去1,它所做的是将常量值-1转换为函数指针 作为旁注,在ISO C中不允许对函数指针进行加法或减法运算,只能像
/usr/include/sys/
中的signal.h
中看到了这一行。基于它用作函数signal
的返回类型,我希望SIG_ERR
是一个指向接受整数输入并返回void的函数的指针。但是SIG_ERR
的宏扩展似乎从函数指针类型中减去了1,我觉得这很奇怪。C如何解析它
#define SIG_ERR ((void (*)(int))-1)
不会从函数指针中减去1,它所做的是将常量值-1转换为函数指针
作为旁注,在ISO C中不允许对函数指针进行加法或减法运算,只能像处理字符指针一样处理函数指针
在GCC中,允许对void类型的指针和指向函数的指针执行加法和减法操作。通常,ISO C不允许对此类指针进行算术运算,因为“void”的大小是一个愚蠢的概念,并且取决于指针实际指向的对象。为了简化这种算法,GCC将引用对象的大小视为一个字节
上面写着:
signal()函数返回信号处理程序的上一个值,或SIG_ERRon error
因此,这个-1
“函数指针”只是一个错误指示值
当然,由于对齐约束,从指针中减去
-1
在大多数平台上没有意义;指针通常是4字节的倍数。啊,太好了!谢谢你的回答。
( (void(*)(int)) -1)