以下两个铸件有什么区别吗?
int a=10;
int *p=&a;
(void)p; //does not give any warning or error
要么
(void *)p; //error: statement with no effect [-Werror=unused-value]
遵守时 gcc -Wall -Werror --std=c99 -pedantic
刚刚在这个答案中看到了。(显然我误会了一些东西)
是的,显然。
(void)p;
意味着该对象将被强制转换为void
类型(不是完整类型)并且作为完整表达式,因此不应使用该表达式的结果,因此编译器不会检查其用途。
引用C11
标准,第6.3.2.2章,void
void
表达式(类型为void的表达式)的(不存在)值不得以任何方式使用,[......]如果将任何其他类型的void
表达式作为表达式求值,则其值或指示符为丢弃。
因此,不会生成警告或错误。
太太
(void *)p;
表示对象是指向void
类型的指针,它是完整类型,应在程序中使用。在这种情况下,编译器正确地报告了表达式中对象的未使用情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句