APUE 10.3信号:指针投射问题。

时间:2014-03-12 07:07:47

标签: c

我正在学习APUE 10.3信号,只是混淆了SIG_ERRSIG_DFLSIG_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 (*)())

3 个答案:

答案 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参数混淆。