C 省略指向结构的指针的前向声明是否有效?
我最近遇到: 你说“要定义指向结构的指针,你只需要知道结构标记”。根据我的经验,这是不必要的。只需声明指向某个类型的指针,编译器就会为指针保留空间,并在赋值时进行类型检查。只有当你想取消引用指针并访问其成员时,类型才能完全被知道。” 我试了一下:C 省略指向结构的指针的前向声明是否有效?,c,pointers,struct,language-lawyer,forward-declaration,C,Pointers,Struct,Language Lawyer,Forward Declaration,我最近遇到: 你说“要定义指向结构的指针,你只需要知道结构标记”。根据我的经验,这是不必要的。只需声明指向某个类型的指针,编译器就会为指针保留空间,并在赋值时进行类型检查。只有当你想取消引用指针并访问其成员时,类型才能完全被知道。” 我试了一下: struct foo { int a; struct bar* x; }; struct bar { int b; }; 事实上,GCC和Clang都不会抛出任何诊断,而不是试图在不进行前向声明的情况下定义相应结构的对象
struct foo {
int a;
struct bar* x;
};
struct bar {
int b;
};
事实上,GCC和Clang都不会抛出任何诊断,而不是试图在不进行前向声明的情况下定义相应结构的对象
但这让我想知道:这符合标准吗
非常感谢引用本标准。如果表示相同,则表示尺寸相同 第6.2.6.1p2节规定: 存储在任何其他对象类型的非位字段对象中的值[ed.not unsigned char] 由
n×CHAR\u位
位组成,其中n是
该类型,以字节为单位。该值可以复制到类型为的对象中
无符号字符[n]
(例如,通过memcpy
)结果字节集为
调用值的对象表示形式。中存储的值
位字段由m个位组成,其中m是指定的大小
对于位字段。对象表示是一组
位字段包含在容纳它的可寻址存储单元中的m位。Tw o值(非NAN)具有相同的
对象表示法比较相等,但比较的值
equal可能具有不同的对象表示形式
例如,gcc下的
int
和short
都使用两个补码,但它们没有相同的对象表示形式,因为一个是4字节,另一个是2字节。如果表示形式相同,则表示大小相同
第6.2.6.1p2节规定:
存储在任何其他对象类型的非位字段对象中的值[ed.not unsigned char]
由n×CHAR\u位
位组成,其中n是
该类型,以字节为单位。该值可以复制到类型为的对象中
无符号字符[n]
(例如,通过memcpy
)结果字节集为
调用值的对象表示形式。中存储的值
位字段由m个位组成,其中m是指定的大小
对于位字段。对象表示是一组
位字段包含在容纳它的可寻址存储单元中的m位。Tw o值(非NAN)具有相同的
对象表示法比较相等,但比较的值
equal可能具有不同的对象表示形式
例如,gcc下的
int
和short
都使用两个补码,但它们没有相同的对象表示,因为一个是4字节,另一个是2字节。引用的文本与C标准的定义不符(与作者的经验无关)。在C语言中,不同类型的指针通常具有不同的大小和表示形式。有一些要求,例如指向结构的指针具有相同的大小和表示,指向char
和void
的指针具有相同的大小和表示。因此,您可以将成员定义为struct Anything*
,然后将其用作struct SomethingElse*
,前提是使用了正确的转换。但是使用MyType*
,不是必须的。@LanguageLawyer很好地找到了。我不能。不管怎样,我仍然在挣扎着是否接受它是重复的。我的问题的一个主要方面是,如果指向任何结构的指针的大小在同一个实现上是相同的,那么在检测“容器”结构的确切大小方面就没有问题了,dbush也已经很好地介绍了这一点。对提议的重复问题的回答“仅”涵盖声明本身有效的情况,但没有一个给出指针大小完全相同的标准证明。他们只说了,但没有给出具体证明。我自己也会问这个问题的答案。我将我的问题标题编辑得更具体一些。如果你想知道在指针声明中引用一个未声明的结构是否合法,那就问问这个问题。如果你想知道所有指向结构的指针是否都是相同大小的,可以问一下这个问题。有必要把这两个问题混在一起吗?看起来很做作。现在改名怎么样?看起来你只是想人为地使dup不是dup。引用的文本对于C标准的定义是不正确的(而不是作者的经历)。在C语言中,不同类型的指针通常具有不同的大小和表示形式。有一些要求,例如指向结构的指针具有相同的大小和表示,指向char
和void
的指针具有相同的大小和表示。因此,您可以将成员定义为struct Anything*
,然后将其用作struct SomethingElse*
,前提是使用了正确的转换。但是使用MyType*
,不是必须的。@LanguageLawyer很好地找到了。我不能。不管怎样,我仍然在挣扎着是否接受它是重复的。我的问题的一个主要方面是,如果指向任何结构的指针的大小在同一个实现上是相同的,那么在检测“容器”结构的确切大小方面就没有问题了,dbush也已经很好地介绍了这一点。对提议的重复问题的回答“仅”涵盖声明本身有效的情况,但没有一个给出正确答案