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
。
我缺少什么?
关键字:所有声明...
int x = 5;
int *xp = &x;
void *vp = xp;
Run Code Online (Sandbox Code Playgroud)
这是三个声明,声明了三个单独的对象:x
、xp
和vp
。
您引用的部分的含义是,如果一个文件说
extern int foo;
Run Code Online (Sandbox Code Playgroud)
另一个文件说
extern double *foo;
Run Code Online (Sandbox Code Playgroud)
该行为是未定义的,因为foo
已使用不同的类型声明了两次。