C 为什么signal()的结果被转换为(void)?

C 为什么signal()的结果被转换为(void)?,c,casting,C,Casting,在一般情况下,一些问题解决了这个问题;然而,在本例中,我看到的只是一个函数返回的值。亲自看看: 第三行,(void)信号(SIGALRM,myAlarm)应该执行系统调用信号,如果我理解正确,它将返回一个指向函数的指针 在一般情况下,我可以理解为什么函数指针被转换为void;然而,除了C的隐式转换之外,该行本身对“内存中”的返回值没有任何作用,因为它只是一个值 我错过什么了吗?(void)是否在第三行(以及程序的其余部分)中实际执行任何操作?即使函数指针的类型与void不同,第三行不是只作用于

在一般情况下,一些问题解决了这个问题;然而,在本例中,我看到的只是一个函数返回的值。亲自看看:

第三行,
(void)信号(SIGALRM,myAlarm)
应该执行系统调用
信号
,如果我理解正确,它将返回一个指向函数的指针

在一般情况下,我可以理解为什么函数指针被转换为
void
;然而,除了C的隐式转换之外,该行本身对“内存中”的返回值没有任何作用,因为它只是一个值


我错过什么了吗?
(void)
是否在第三行(以及程序的其余部分)中实际执行任何操作?即使函数指针的类型与void不同,第三行不是只作用于返回的值,而不是(假设)存储的值吗?简而言之,这是必要的还是冗余?

这是为了抑制编译器关于未使用的返回值(来自函数调用)的警告。

因此可以肯定地说1)在这种情况下,我们没有隐式强制转换,因为没有左值;2) 强制转换被用作“使用”值的一种形式,因此它相当于使用
信号(SIGALRM,myAlarm)=0
,只是为了“使用”返回值?如果是这样的话,我真的应该开始担心明显的警告,因为在使用gcc时我真的不在乎它们,@mauriziocarcasona
我真的应该开始担心明显的警告,
你必须。你是对的,特别是在C语言中:在标准中,函数指针或任何其他类型如何显式转换为
void
,并不完全清楚。第6.3.2.2节未描述如何将非void表达式转换为
void
。它仅描述作为空表达式计算的表达式的效果。(计算为空表达式的一个示例是逗号运算符的左操作数。)它让读者猜测将表达式的值转换为
void
与计算为空表达式的表达式具有相同的效果。但是,标准中有一个函数返回值的例子,它是通过第1节第8节的实例(Case-实例),明确地转换为 Value/Cuth>的。关于类似的问题:我丢弃它们,因为它们是基于C++的,而不是C。然而,结合这个问题的答案和类似问题的答案,我想C也是如此。显然,相对于任何其他动作,空心铸造是一种特殊类型的铸造。