我正在学习APUE 10.3信号,只是混淆了SIG_ERR
,SIG_DFL
和SIG_IGN
的定义。这是定义:
#define SIG_ERR (void (*)())-1
#define SIG_DFL (void (*)())0
#define SIG_IGN (void (*)())1
这是信号函数原型:
void (*signal(int signo, void (*func)(int)))(int)
当我们致电signal(signo, SIG_DFL)
时,为什么没有功能不匹配问题,因为第二个参数应该是void (*)(int))
,但是,我们提供的SIG_DFL
是(void (*)())
的类型,void (*)(int))
vs (void (*)())
?
答案 0 :(得分:1)
声明如下的函数:type function()
表示您没有指定该函数的参数,因此您可以使用任何参数调用该函数,也可以不调用该函数。实际上,这只是告诉编译器忽略该函数参数的类型检查,因为你不使用它们。
声明没有参数的函数的正确方法是type function(void)
。
因此,实际上,当对void (*)())
进行类型检查void (*)(int))
时,编译器只检查返回值类型。
请注意,它在C ++中是不正确的,仅在C中。在C ++中,type function()
相当于type function(void)
。
您可以查看官方的 C99 规范here。函数定义位于 6.9.1 ,第141页。
答案 1 :(得分:1)
虽然在C中没有显式void
参数的函数可以获取不确定数量的不确定类型参数,但是这些定义在C ++中不起作用。
然而,虽然您可能在本书中找到了这些内容,但它们并不存在于实际系统中的那种形式,只是因为它必须在C ++中工作。例如,在我的Linux系统上,我有
#define SIG_DFL ((__sighandler_t) 0
其中__sighandler_t
是
typedef void (*__sighandler_t) (int);
答案 2 :(得分:0)
函数声明中的空括号()
表示函数可以使用未指定的参数。请不要与描述没有争论的void
参数混淆。