首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C向前向声明类型胡枝子f结构

C向前向声明类型胡枝子f结构
EN

Stack Overflow用户
提问于 2018-12-29 19:16:25
回答 2查看 1.5K关注 0票数 0

我正试着转发声明typedef结构车轮。

代码语言:javascript
复制
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结构汽车上方,这样就能工作了。

如何正确申报结构车轮?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-29 19:40:59

以下是C标准中的相关部分(重点是后加的):

§6.2.5p1

在翻译单元内的各个点,对象类型可以是不完整的(缺乏足够的信息来确定该类型对象的大小),也可以是完整的(具有足够的信息)。

第6.7.2p3节

结构或联合不应包含具有不完全或函数类型的成员(因此,结构不应包含自身的实例,但可以包含指向自身实例的指针),但具有多个指定成员的结构的最后一个成员可能具有不完全数组类型;这种结构(以及任何可能以递归方式包含此类结构的成员)不应是结构的成员或数组的元素。

第一个typedef声明了一个名为wheels的不完整类型。car结构使用该不完整类型作为成员。这是标准明确禁止的。

这就是第一条错误信息告诉你的。另外两条错误信息只是噪音。它们是编译器没有足够信息来完成car结构这一事实的结果。

正如在另一个答案中提到的,不完全类型的一个用法是声明指针。例如,链接列表中的节点,其中结构包含指向自身的指针:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-12-29 19:29:35

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53972640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档