其中<signal.h>有以下定义:
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
我认为void (*)()这是一个函数指针,返回类型为void,参数为void(因为括号之间为空)。
但是在signal()函数中,第二个参数类型是void (*func)(int)。
那么,为什么上面三件事的定义是void (*)()。而且,-1 0 1定义中的数字是什么意思?
我如何解释这些定义?
你的定义和我的不一样。如果我预处理以下文件:
#include <signal.h>
SIG_IGN
SIG_DFL
SIG_ERR
Run Code Online (Sandbox Code Playgroud)
预处理器输出中的最后 3 行是
% gcc -E sigtest.c|tail -n3
((__sighandler_t) 1)
((__sighandler_t) 0)
((__sighandler_t) -1)
Run Code Online (Sandbox Code Playgroud)
类型定义是
typedef __signalfn_t *__sighandler_t;
Run Code Online (Sandbox Code Playgroud)
和
typedef void __signalfn_t(int);
Run Code Online (Sandbox Code Playgroud)
从asm-generic/signal-defs.h。所以肯定是你有一些旧的标题。
然而,这不是 C++,而是 C。C 中的空括号意味着函数参数未声明/函数可以接受任意数量的参数。自 C89 标准以来,这已被认为已过时。然而,类型的值void (*)()将与 兼容void (*)(int)。
值 -1、0 和 1 是不可移植的魔术常量,仅对 Linux 内核有意义。