我正试着转发声明typedef结构车轮。
typedef struct wheels wheels;
typedef struct car {
float topSpeed;
wheels w;
} car;
typedef struct wheels {
int frontWheels;
int backWheels;
} wheels;
int main() {
car c = {
.topSpeed = 255.0,
.w = {
.frontWheels = 2,
.backWheels = 2,
}
};
return 0;
}这给我带来了以下错误:
错误:字段w有不完整的类型轮w; 错误:字段名不在记录或联合初始化程序.frontWheels =2中 错误:字段名不在记录或联合初始化程序.backWheels =2中
我知道我可以将整个typedef结构车轮移动到typedef结构汽车上方,这样就能工作了。
如何正确申报结构车轮?
发布于 2018-12-29 19:40:59
以下是C标准中的相关部分(重点是后加的):
§6.2.5p1
在翻译单元内的各个点,对象类型可以是不完整的(缺乏足够的信息来确定该类型对象的大小),也可以是完整的(具有足够的信息)。
第6.7.2p3节
结构或联合不应包含具有不完全或函数类型的成员(因此,结构不应包含自身的实例,但可以包含指向自身实例的指针),但具有多个指定成员的结构的最后一个成员可能具有不完全数组类型;这种结构(以及任何可能以递归方式包含此类结构的成员)不应是结构的成员或数组的元素。
第一个typedef声明了一个名为wheels的不完整类型。car结构使用该不完整类型作为成员。这是标准明确禁止的。
这就是第一条错误信息告诉你的。另外两条错误信息只是噪音。它们是编译器没有足够信息来完成car结构这一事实的结果。
正如在另一个答案中提到的,不完全类型的一个用法是声明指针。例如,链接列表中的节点,其中结构包含指向自身的指针:
typedef struct node Node; // struct node and Node are incomplete types here
struct node
{
int value;
Node *next; // using an incomplete type to declare a pointer
}; // struct node and Node are complete from here forward发布于 2018-12-29 19:29:35
您只能拥有指向不完整的前向定义结构或联合的指针。
https://stackoverflow.com/questions/53972640
复制相似问题