2014-03-12 136 views
1

我正在学习APUE 10.3信号,只是混淆了SIG_ERR,SIG_DFLSIG_IGN的定义。这里的定义是:APUE 10.3信号:指针投射问题。

#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))(void (*)())的类型?

回答

1

一个声明如下的函数:type function()意味着你没有指定该函数的参数,所以你可以用任何参数或无参数调用该函数。事实上,这只是告诉编译器忽略该函数的参数的类型检查,因为你不使用它们。 声明不带参数的函数的正确方法是type function(void)

所以,实际上,当类型检查void (*)())void (*)(int)),编译器只检查返回值类型。

请注意,它不是在C++中,只在C中。在C++中,type function()相当于type function(void)

您可以查看官方C99规格here。功能定义在6.9.1,第141页。

+0

感谢所有球员的帮助。请让我知道它的证据吗?我的意思是我能够学习它的书籍,文档或规格? – kevin

+0

我添加了规格 – FreeSalad

0

空括号()在函数声明中意味着函数可以带未指定的参数。请不要混淆void这个描述没有参数的论点。

1

虽然这将在C(这里没有明确void参数的函数采用的不确定类型参数的数目不确定)没事的,这些定义不会用C++工作。

但是,虽然您可能在书中找到了这些内容,但它们并不以真正的系统形式存在,仅仅是因为它也必须以C++工作。例如,我的Linux系统上我有

#define SIG_DFL ((__sighandler_t) 0 

其中__sighandler_t

typedef void (*__sighandler_t) (int);