以下两种铸件有什么区别吗?
int a=10;
int *p=&a;
(void)p; //does not give any warning or error
Run Code Online (Sandbox Code Playgroud)
要么
(void *)p; //error: statement with no effect [-Werror=unused-value]
Run Code Online (Sandbox Code Playgroud)
什么时候遵守 gcc -Wall -Werror --std=c99 -pedantic
刚看到这个答案. (显然我误解了一些事情)
Som*_*ude 14
当你这样做
(void) p;
Run Code Online (Sandbox Code Playgroud)
您告诉编译器只是忽略表达式的结果p.它实际上与空语句相同:
;
Run Code Online (Sandbox Code Playgroud)
当你这样做
(void *) p;
Run Code Online (Sandbox Code Playgroud)
您告诉编译器将变量p视为泛型指针,这是该语句的完整表达式,这个表达式实际上没有做任何事情而且您得到错误消息.
Sou*_*osh 11
是的,很明显.
(void)p;
Run Code Online (Sandbox Code Playgroud)
表示对象被转换为void类型(不是完整类型)并且作为完整表达式,不应使用表达式的结果,因此编译器不会检查它的用法.
引用C11标准,第6.3.2.2章,void
void表达式(不具有类型为void的表达式)的(不存在)值不得以任何方式使用,[......]如果任何其他类型的void表达式被计算为表达式,则其值或指示符为丢弃.
因此,不会生成警告或错误.
OTOH,
(void *)p;
Run Code Online (Sandbox Code Playgroud)
表示对象是指向void类型的指针,这是一个完整的类型,应该在程序中使用.在这种情况下,编译器正确地报告了表达式之外的对象的不使用.