繁体   English   中英

C向前声明typedef结构

[英]C forward declaration for typedef struct

我正在尝试向前声明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 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

您只能拥有指向不完整的前向定义结构或联合的指针

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM