void 指针与其他指针类型的兼容性

rwa*_*ace 2 c pointers c11

void*可以将 a 赋值给任何指针变量或从任何指针变量赋值,这是 C 语言的一个常见功能。在 C11 的标准草案 N1570 中,具体如下6.3.2.3 Pointers

指向 void 的指针可以与指向任何对象类型的指针相互转换。指向任何对象类型的指针都可以转换为指向 void 的指针,然后再转换回来;结果应等于原始指针。

6.2.7 Compatible type and composite type

引用同一对象或函数的所有声明应具有兼容的类型;否则,行为是未定义的。

然而,据我所知,该部分并未说明void*其他指针类型兼容。所以:

int x = 5;
int *xp = &x;
void *vp = xp;
Run Code Online (Sandbox Code Playgroud)

预计传统 和 是完全有效的6.3.2.3,但似乎是未定义的行为6.2.7

我缺少什么?

mel*_*ene 5

关键字:所有声明...

int x = 5;
int *xp = &x;
void *vp = xp;
Run Code Online (Sandbox Code Playgroud)

这是三个声明,声明了三个单独的对象:xxpvp

您引用的部分的含义是,如果一个文件说

extern int foo;
Run Code Online (Sandbox Code Playgroud)

另一个文件说

extern double *foo;
Run Code Online (Sandbox Code Playgroud)

该行为是未定义的,因为foo已使用不同的类型声明了两次。