ошибка: размер хранилища 'name' неизвестен - PullRequest
0 голосов
/ 07 мая 2018

Я получаю эту ошибку при компиляции. Может кто-нибудь сказать мне, почему это происходит? У меня есть эти структуры объявлены в 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;
};

У меня также есть эти typedefs в board.h:

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 Ответ

0 голосов
/ 07 мая 2018

При компиляции chess.c необходимо знать, что расширяет определение типа Pieces, чтобы обработать переменную, объявленную с этим типом.

Типы указателей можно обрабатывать, не зная полного определения типа, на который он указывает, но типы объектов должны знать полное определение, поскольку они выделяют пространство для переменной. И чтобы узнать, сколько места требуется, компилятор должен знать, каковы члены структуры.

Когда компилятор обрабатывает chess.c, он имеет только информацию в этом исходном файле и любые файлы, которые он включает. Если у вас где-то нет #include "board.c", определение структуры недоступно при компиляции chess.c. Обычно неправильно использовать #include с файлами .c, обычно его следует использовать только с файлами .h. Вот почему определения структур и соответствующие им определения типов обычно помещаются в файл .h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...