将整数转换为信号代码中的函数指针 - 为什么这样做?

Joh*_*0te 10 c c++ unix

我正在读一本书(UNIX环境中的高级编程),我正在阅读有关信号的部分.

使用信号功能时:

void (*signal(int signo, void (*func)(int)))(int);
Run Code Online (Sandbox Code Playgroud)

参数func可以是指向用户定义的函数的指针,也可以是SIG_ERR,SIG_DFL或SIG_IGN.

我的问题不在UNIX的部分,但我想提供背景知识.我真正想知道的是,这本书指出这些常数是不确定的:

#define SIG_ERR (void (*)())-1
Run Code Online (Sandbox Code Playgroud)

等等为0和1.

现在,我有一些不错的猜测,但为了节省时间 - 有人能告诉我这是做什么以及它为什么有效?

还有......呃......干净吗?假设我使用C++并与此C API交互,写这个的方法?

Oli*_*rth 11

它正在向函数指针强制转换整数; *可能会选择占位符值,以便它们永远不会与实际函数指针的值发生冲突.然后,signal推测的实现会检查这些特殊值的输入参数.


*C标准允许这样做(见6.3.2.3第5页),尽管它说结果是实现定义的.显然,操作系统的作者能够控制实现定义的方面,所以一切都好.