Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数指针中减去1_C_Linux_Signals - Fatal编程技术网

C 从函数指针中减去1

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中不允许对函数指针进行加法或减法运算,只能像

我在mac上的
/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)