假设我们在C或C++中定义了两个结构(我在C和C++中得到相同的结果,我认为规则是相同的,告诉我它们是否不相同).
一个值不完整的值成员:
struct abc{
int data;
struct nonexsitnow next; //error: field ‘next’ has incomplete type, makes sense since "struct nonexsitnow" hasn't been declared or defined.
};
Run Code Online (Sandbox Code Playgroud)
以及一个不完整类型的指针成员:
struct abc{
int data;
struct nonexsitnow *next; //pass?!
};
Run Code Online (Sandbox Code Playgroud)
为什么第二个定义不会导致任何问题?它使用struct nonexsitnow尚未创建!
我在下面的答案和评论中总结了这张表,希望它们对于详细说明是正确和有用的.
正如@ArneVogel提到,无论是struct Foo p;和struct Foo *p;是一个隐含的声明Foo,并struct Foo;明确地做这件工作(感谢@约翰布林).这对c来说几乎没有任何意义,但对c ++和行为有所不同:
In a situation where struct Foo is:
_______________________________________________________
| | undeclared | declared but | defined |
| | …Run Code Online (Sandbox Code Playgroud)