【问题标题】:C forward declaration for typedef structtypedef 结构的 C 前向声明
【发布时间】:2018-12-29 19:16:25
【问题描述】:

我正在尝试转发声明 typedef structwheels。

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 car 上方,这样就可以了。

如何正确转发声明结构轮?

【问题讨论】:

  • 对于结构object的变量的定义,你需要结构的完整定义(因为编译器需要知道它的大小)。前向声明对于结构的指针非常有用,因为编译器只需要知道指针的大小而不是整个结构。
  • 您可以前向声明结构,但不能使用前向声明的结构来声明变量(或其他结构成员)。为什么需要前向声明它?似乎没有必要。
  • 而在这种情况下,为什么struct wheels的定义不能在struct car之前呢? wheels 结构不依赖于car,因此可以轻松移动。
  • 对于这种特定情况,移动并没有什么不同。我想知道在 C 中是否有可能有这样的前向声明。

标签: c struct typedef forward-declaration


【解决方案1】:

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

§6.2.5p1

在翻译单元内的不同点,对象类型可能是 不完整(缺乏足够的信息来确定 该类型的对象)或完整(具有足够的信息)。

§6.7.2p3

结构或联合不应包含不完整的成员或 function type (因此,结构不应包含 本身,但可能包含指向自身实例的指针),除了 具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这样的结构(以及任何工会 可能递归地包含这样一个结构的成员) 不得是结构的成员或数组的元素。

第一个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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多