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

C APUE 10.3信号:指针投射问题。,c,C,我正在学习APUE 10.3信号,只是混淆了SIG\u ERR、SIG\u DFL和SIG\u IGN的定义。定义如下: #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #define SIG_IGN (void (*)())1 这是信号功能原型: void (*signal(int signo, void (*func)(int)))(int) 当我们调用信号(signo,SIG_-DFL)时,为什么没有函

我正在学习APUE 10.3信号,只是混淆了
SIG\u ERR
SIG\u DFL
SIG\u IGN
的定义。定义如下:

 #define SIG_ERR (void (*)())-1
 #define SIG_DFL (void (*)())0
 #define SIG_IGN (void (*)())1
这是信号功能原型:

 void (*signal(int signo, void (*func)(int)))(int) 

当我们调用
信号(signo,SIG_-DFL)
时,为什么没有函数不匹配的问题,因为第二个参数应该是
void(*)(int))
,然而,我们提供的
SIG_-DFL
(void(*)()
void(*)(int))
(void(*)()

空括号
()
在函数声明中表示函数可以接受未指定的参数。请不要与不描述参数的
void
参数混淆。

这样声明的函数:
type function()
表示您不指定该函数的参数,因此可以使用任何参数或无参数调用该函数。事实上,这只是告诉编译器忽略该函数参数的类型检查,因为您不使用它们。 声明无参数函数的正确方法是
type function(void)

因此,事实上,当对
void(*)(int))
进行类型检查时,编译器只检查返回值类型

注意,C++中不是真的,只有C++中的C.,<代码>类型函数()/Cuffe等于“代码>类型函数(空))//> > < >


您可以查看官方的C99规范。函数定义在<强> 67.1,第141页。< /P> < P>。C(在没有显式<代码> Value>代码>参数的情况下,不确定类型的参数不确定),这将是不正确的,在C++中,这些定义将不起作用。 然而,虽然你可能在书中找到了这些,但是它们在真实系统中并不存在,只是因为它也必须在C++中工作。例如,在我的Linux系统上

#define SIG_DFL ((__sighandler_t) 0
其中
\u sighandler\t

typedef void (*__sighandler_t) (int);

谢谢你们的帮助。你能告诉我证据吗?我指的是我能够学习的书籍、文件或规格?