【发布时间】:2018-07-09 10:22:13
【问题描述】:
假设我们在 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.
};
还有一个带有不完整类型的指针成员:
struct abc{
int data;
struct nonexsitnow *next; //pass?!
};
为什么第二个定义不会引起任何问题?它使用尚未创建的struct nonexsitnow!
更新:
我从下面的答案和 cmet 中总结了这张表,希望它们是正确的并且对阐述有所帮助。
正如@ArneVogel 所提到的,struct Foo p; 和struct Foo *p; 都是Foo 的隐式声明,而struct Foo; 明确地完成了这项工作(感谢@John Bollinger)。这对c 几乎没有任何意义,但对c++ 和行为有影响:
In a situation where struct Foo is:
_______________________________________________________
| | undeclared | declared but | defined |
| | | not defined | |
-------------------------------------------------------
| | C | C++ | C | C++ | C | C++ |
-------------------------------------------------------
|struct Foo p; | × | × | × | × | √ | √ |
|struct Foo* p; | √ | √ | √ | √ | √ | √ |
| Foo p; | × | × | × | × | × | √ |
| Foo* p; | × | × | × | √ | × | √ |
【问题讨论】:
-
我不同意这个副本。这个问题是关于声明一个不完整类型的对象的实例。这与“为什么我们使用指向不完整类型的指针”不是同一个问题。
-
我也很困惑为什么这被否决了。第一次看到这似乎是非常不寻常的行为。
-
@Lundin - 什么?它询问为什么指针起作用。另一个问我们为什么使用指针以及为什么非指针不起作用。
-
@Lundin:是的,没有任何特定于 C++ 的内容。另一方面,它也不是 C 特定的。
-
“它使用
struct nonexsitnow”不,它没有
标签: c c++ c++ c pointers struct