【问题标题】:error: storage size of 'name' isn't known错误:“名称”的存储大小未知
【发布时间】:2018-05-07 19:53:56
【问题描述】:

我在编译时不断收到此错误。有人能告诉我为什么会这样吗? 我在 board.c 中声明了这些结构:

struct point {
  short int rank;
  short int file;
};

struct pieces {
  Point pawns[8];
  Point Knights[2];
  Point BBishop;
  Point WBishop;
  Point Rooks[2];
  Point Queen;
  Point King;
};

board.h 中也有这些 typedef:

typedef struct point Point;
typedef struct pieces Pieces;

在主源文件 (chess.c) 中,我有声明:

Pieces White;

当我编译它说:

chess.c: In function 'main':
chess.c:19:10: error: storage size of 'White'isn't known

我尝试将结构移到board.h,效果很好。为什么当我在 board.c 中有结构时它不起作用?

gcc 编译器

【问题讨论】:

  • 1 周前我刚刚完成了一个项目,其中涉及列表及其管理。我在 .c 源文件中声明了结构,它运行良好。
  • 声明出现的顺序在 C 中很重要。将结构定义和 typedef 组合在 .h 文件中的同一位置通常是个好主意,这样它们将始终引用同一事物什么时候包含 .h 也没关系。

标签: c gcc struct compiler-errors


【解决方案1】:

在编译chess.c 时,它需要知道Pieces 类型定义扩展为什么,以便处理使用该类型声明的变量。

指针类型可以在不知道它指向的类型的完整定义的情况下进行处理,但是对象类型需要知道完整的定义,因为它们为变量分配空间。而要知道需要多少空间,编译器需要知道结构成员是什么。

当编译器处理chess.c 时,它只具有该源文件及其包含的任何文件中的信息。除非您在某处有#include "board.c",否则编译chess.c 时结构定义不可用。将#include 与.c 文件一起使用通常是错误的,它通常只能与.h 文件一起使用。这就是为什么结构定义及其对应的 typedef 通常放在 .h 文件中的原因。

【讨论】:

  • 我了解编译器对此答案的需求。我不认为你已经回答了 OP 的问题“为什么当我在 board.c 中有结构时它不起作用?”
  • @P.Brian.Mackey 添加了另一段来解释这一点。
  • 我明白了。因此,例如,如果 board.h 中的语句是“typedef struct pieces *Pieces”,那么它会起作用,因为 Pieces 类型的任何变量都是指针?
猜你喜欢
  • 1970-01-01
  • 2012-02-06
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多