将指针转换为 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
视为通用指针,这是语句的完整表达式,一个实际上不执行任何操作的表达式,您会收到错误消息。
下面两个铸件有什么区别吗?
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 avoid
expression, its value or designator is discarded.
因此,不会生成任何警告或错误。
OTOH,
(void *)p;
表示对象是指向void
类型的指针,这是一个完整的类型,应该在你的程序中使用。在那种情况下,编译器会正确地报告未使用表达式之外的对象。
当你这样做时
(void) p;
您告诉编译器简单地忽略表达式 p
的结果。它实际上与空语句相同:
;
当你这样做时
(void *) p;
您告诉编译器将变量 p
视为通用指针,这是语句的完整表达式,一个实际上不执行任何操作的表达式,您会收到错误消息。