以下两种铸件有何不同之处?
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
编译时。
我在这个答案中看到了这个命令。(显然我误解了某些事情)
以下两种铸件有何不同之处?
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;
你告诉编译器仅仅忽略表达式 p
的结果。这和一个空语句是一样的效果:
;
当你做
(void *) p;
你告诉编译器将变量p
视为通用指针,这就是语句的完整表达式,但实际上它并没有做任何事情,因此你会收到错误信息。
是的,显然。
(void)p;
表示对象被强制转换为 void
类型(这不是完整的类型),作为完整表达式,不能使用表达式结果,因此编译器不会检查它的使用情况。
引用 C11
标准,第 6.3.2.2 章节,关于 void
一个无类型表达式(具有 void 类型的表达式)的(不存在的)值不得以任何方式使用,[...] 如果将任何其他类型的表达式评估为 void 表达式,则其值或指示符将被丢弃。
因此,不会生成警告或错误。
另一方面,
(void *)p;
指针的对象是 void
类型,它是一个完整的类型,应该在程序中使用。在这种情况下,如果对象未在表达式之外使用,则编译器会正确报告。
p
所指向的地址的值是否发生了任何变化? - ameyCUvoid
? - ameyCUp
本身产生任何影响呢? :) - Sourav Ghosh
IFDEF
内部使用,以使其在使用ELSE
分支的设置进行编译时不会引发警告。 - Mason Wheeler(void)sideEffectingFunction(a = b, c++);
简化为;
,但显然并非如此。 - Alex Celestevoid
是一种消除潜在编译器警告的方法,以防止未使用的函数参数。 - Some programmer dude