Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C类型定义结构的转发声明_C_Struct_Typedef_Forward Declaration - Fatal编程技术网

C类型定义结构的转发声明

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结构控制盘

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语言中是否可能有这样的转发声明。