为什么是
void foo(T*);
Run Code Online (Sandbox Code Playgroud)
在C和C++中都是非法的(因为T未定义),而
void foo(struct T*);
Run Code Online (Sandbox Code Playgroud)
是有效的,即使它仍然没有定义 T?是否存在对调用者产生语义差异的情况,无论T是结构还是其他类型(class/enum/typedef/etc.)?
void foo(struct T*);同时作为struct T该范围内的前向声明,因此命名指向它的指针是安全的.
在void foo(T*)那里,没有人知道T应该是什么.如果事实证明它是变量的名称而不是类型,那么代码行就是格式错误的.在可以说代码行有效之前,C++需要更多信息.
在C中,因为指向结构(任何结构)的指针都具有相同的宽度和对齐属性
6.2.5/27(C99标准)
指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求.同样,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求.所有指向结构类型的指针都应具有相同的表示和对齐要求.所有指向union类型的指针都应具有相同的表示和对齐要求.指向其他类型的指针不需要具有相同的表示或对齐要求.
另一方面,指向任何东西的指针可能具有不同的宽度和/或对齐属性(void*,函数指针,unsigned char*,...)