将指针转换为 void

Casting pointer to void

下面两个铸件有什么区别吗?

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

Just saw that in this answer.(显然我误解了什么)

是的,很明显。

 (void)p;

意味着对象被转换为 void 类型,(这不是一个完整的类型)并且是完整的表达式,不应使用表达式的结果,因此编译器不会检查这是用法。

引用 C11 标准,第 6.3.2.2 章,void

The (nonexistent) value of a void expression (an expression that has type void) shall not be used in any way,[......] If an expression of any other type is evaluated as a void expression, its value or designator is discarded.

因此,不会生成任何警告或错误。

OTOH,

(void *)p;

表示对象是指向void类型的指针,这是一个完整的类型,应该在你的程序中使用。在那种情况下,编译器会正确地报告未使用表达式之外的对象。

当你这样做时

(void) p;

您告诉编译器简单地忽略表达式 p 的结果。它实际上与空语句相同:

;

当你这样做时

(void *) p;

您告诉编译器将变量 p 视为通用指针,这是语句的完整表达式,一个实际上不执行任何操作的表达式,您会收到错误消息。