【问题标题】:Is the omission of a forward declaration for a pointer to a structure valid? [duplicate]省略指向结构的指针的前向声明是否有效? [复制]
【发布时间】: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 都不会抛出任何诊断,而不是尝试在没有前向声明的情况下定义相应结构的对象。

Evidence

但这让我想知道:这是否符合标准?

高度赞赏该标准的引用。

【问题讨论】:

  • 引用的文字对于 C 标准定义的内容是不正确的(与作者的经历无关)。在 C 中,不同种类的指针通常可能具有不同的大小和表示。有一些要求,例如指向结构的指针具有相同的大小和表示形式,并且指向charvoid 的指针具有相同的大小和表示形式。因此,您可以将成员定义为struct Anything *,然后将其用作struct SomethingElse *,前提是使用了正确的转换。但是使用MyType *,不需要工作。
  • @LanguageLawyer 很好找到。我不能。无论如何,我仍然在努力是否接受它作为重复。我的问题的主要方面之一是标准证明,如果指向任何结构的指针的大小在同一实现上相同,因此在检测“容器”结构的确切大小时没有问题,dbush 也已经盖得很好。建议的重复问题的答案仅涵盖声明本身有效的情况,但它们都没有提供关于指针大小完全相同的标准证明。
  • 他们只说了,没有给出具体的证据。我也自己问这个问题的答案。我编辑了我的问题标题,使其更加具体。这是一个令人毛骨悚然的案例。
  • 如果您想知道在指针声明中引用未声明的结构是否合法,请询问此问题。如果您想知道是否所有指向结构的指针都具有相同的大小,请询问此问题。有必要把这两个问题混在一起吗?看起来很人造。
  • 现在改头换面的标题怎么样?看起来你只是想人为地让一个副本不是副本。

标签: c pointers struct language-lawyer forward-declaration


【解决方案1】:

如果表示相同,则表示大小相同。

C standard 的第 6.2.6.1p2 节指出:

存储在任何其他对象类型的非位域对象中的值 [ed.不是无符号字符] 由n×CHAR_BIT 位组成,其中 n 是对象的大小 该类型,以字节为单位。该值可以复制到类型的对象中 unsigned char [n](例如,memcpy); 得到的字节集是 称为值的对象表示值存储在 位域由 m 位组成,其中 m 是指定的大小 对于位域。对象表示是一组 m 位位域包含在保存它的可寻址存储单元中。具有相同的两个值(NaN 除外) 对象表示比较相等,但比较的值 equal 可能有不同的对象表示。

例如,gcc 下的 intshort 都使用二进制补码,但它们没有相同的对象表示,因为一个是 4 个字节,另一个是 2 个字节。

【讨论】:

  • 我问的不是很好,把两个问题合二为一。我的错,我很抱歉。我接受了一个骗子,并想问你是否可以对my other question specific question 实施这个答案,以便一切都很好,人们也可以更好地找到你的答案。除非它不会很快关闭。
猜你喜欢
  • 2020-04-30
  • 1970-01-01
  • 2015-06-28
  • 2017-01-19
  • 2016-08-14
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多