【发布时间】:2020-07-10 18:30:40
【问题描述】:
我最近遇到了this comment by @Paul Ogilvie:
“您说“要定义指向结构的指针,您只需要知道结构标记”。根据我的经验,这是不必要的。只需声明一个 pointer_to_some_type ,编译器将为指针保留空间并在分配时进行类型检查. 只有当你想取消引用指针并访问它的成员时,类型才能完全知道。”
我试过了:
struct foo {
int a;
struct bar* x;
};
struct bar {
int b;
};
事实上,GCC 和 Clang 都不会抛出任何诊断,而不是尝试在没有前向声明的情况下定义相应结构的对象。
但这让我想知道:这是否符合标准?
高度赞赏该标准的引用。
【问题讨论】:
-
引用的文字对于 C 标准定义的内容是不正确的(与作者的经历无关)。在 C 中,不同种类的指针通常可能具有不同的大小和表示。有一些要求,例如指向结构的指针具有相同的大小和表示形式,并且指向
char和void的指针具有相同的大小和表示形式。因此,您可以将成员定义为struct Anything *,然后将其用作struct SomethingElse *,前提是使用了正确的转换。但是使用MyType *,不需要工作。 -
@LanguageLawyer 很好找到。我不能。无论如何,我仍然在努力是否接受它作为重复。我的问题的主要方面之一是标准证明,如果指向任何结构的指针的大小在同一实现上相同,因此在检测“容器”结构的确切大小时没有问题,dbush 也已经盖得很好。建议的重复问题的答案仅涵盖声明本身有效的情况,但它们都没有提供关于指针大小完全相同的标准证明。
-
他们只说了,没有给出具体的证据。我也自己问这个问题的答案。我编辑了我的问题标题,使其更加具体。这是一个令人毛骨悚然的案例。
-
如果您想知道在指针声明中引用未声明的结构是否合法,请询问此问题。如果您想知道是否所有指向结构的指针都具有相同的大小,请询问此问题。有必要把这两个问题混在一起吗?看起来很人造。
-
现在改头换面的标题怎么样?看起来你只是想人为地让一个副本不是副本。
标签: c pointers struct language-lawyer forward-declaration