gpt4 book ai didi

c - 尚未定义类型的数组(不完整的元素类型)

转载 作者:行者123 更新时间:2023-12-04 06:33:55 26 4
gpt4 key购买 nike

是否可以创建已声明但未定义类型的数组?这就是我想做的:

typedef struct _indiv indiv;
typedef indiv pop[];

并让其他人通过在另一个 .c 或 .h 文件中定义 struct _indiv 来决定个人的成员实际上是什么(然后将所有内容链接在一起)。

(就语义而言,indiv 是一个个体,pop 是一个个体群体。)

但是编译器提示:
error: array type has incomplete element type

我可以用
typedef indiv * pop;

并通过访问像 p[i] 这样的元素来像数组一样使用 pop (使用 pop 类型的 p),但如果我这样做,编译器会提示
error: invalid use of undefined type ‘struct _indiv’
error: dereferencing pointer to incomplete type

我想从 typedef struct _indiv indiv只是一个声明,编译器在编译时(链接之前)不知道该结构需要多少空间以及它不喜欢它,因此禁止执行我正在尝试的操作。但我想知道为什么以及是否有可能实现我想要的方法。

谢谢

最佳答案

您是对的,编译器不知道不完整类型的大小(在您的示例中, struct _indiv 是不完整类型),这就是您不能声明此类类型的变量的原因。这包括创建此类类型的数组。

然而,这并不重要,因为如果您没有类型的完整定义,那么无论如何您都无法明智地访问其成员:如果您写 p[i].foo ,你怎么知道这个类型是否真的有一个成员叫foo ,如果是,它是什么类型?

如果您想要 struct类型的成员要在另一个 .c 中定义文件(这被称为“不透明类型”),那么您只能创建和处理指向该结构的指针。您的其他 .c应该包含所有实际访问 struct 的代码本身。只有不完整类型的文件将包含如下代码:

indiv *i1, *i2;

i1 = new_individual("foo"); /* Create an individual */
i2 = new_individual("bar");

print_individual(i1);

...以及带有 struct 完整定义的源文件将包含 new_individual() 的实现, print_individual()等等。

在这种方案下,处理人口的最简单方法是将其设为指向 indiv 的指针数组。结构。

关于c - 尚未定义类型的数组(不完整的元素类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com