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-实例),明确地转换为