C类型定义结构的转发声明
我正在尝试向前声明typedef结构控制盘C类型定义结构的转发声明,c,struct,typedef,forward-declaration,C,Struct,Typedef,Forward Declaration,我正在尝试向前声明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 = {
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”的类型不完整
错误:字段名不在记录或联合初始值设定项中。frontWheels=2
错误:字段名不在记录或联合初始值设定项中。backWheels=2
我知道我可以将整个typedef struct轮子移动到typedef struct车的上方,它会工作的
如何正确地正向声明结构控制盘?您只能拥有指向不完整的正向定义结构或联合的指针以下是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
对于结构对象变量的定义,您需要结构的完整定义(因为编译器需要知道它的大小)。正向声明对于指向结构的指针非常有用,因为编译器只需要知道指针的大小,而不需要知道整个结构。可以正向声明结构,但不能使用正向声明的结构来声明变量(或其他结构成员)。你为什么需要转寄申报?似乎没有必要。在这种情况下,为什么
struct wheels
的定义不能放在struct car
之前呢?车轮
结构在任何方面都不依赖于汽车
,因此它很容易移动。在这种特定情况下,移动没有什么区别。我想知道在C语言中是否可能有这样的转发声明。