Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 省略指向结构的指针的前向声明是否有效?_C_Pointers_Struct_Language Lawyer_Forward Declaration - Fatal编程技术网

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也已经很好地介绍了这一点。对提议的重复问题的回答“仅”涵盖声明本身有效的情况,但没有一个给出正确答案