Не удается отправить указатель на структуру после ее перемещения в другой заголовочный файл

avatar
atiedebee
1 июля 2021 в 18:25
126
1
2

У меня есть программа, распределенная по трем разным файлам C, с двумя заголовочными файлами, которые идут вместе с ней. Первоначально у меня был заголовок «Player.h», который я использовал для сохранения структуры «карты» (среди прочего):

#ifndef PLAYER_H_INCLUDED
#define PLAYER_H_INCLUDED
typedef struct map{
    float x;
    float y;
}map;
/// some other functions and structures///
#endif

Я хотел переместить его в отдельный заголовочный файл "Map.h", чтобы он содержал другие функции и структуры, связанные с картой.

#ifndef MAP_H_INCLUDED
#define MAP_H_INCLUDED
typedef struct map{
    float x;
    float y;
}map;
#endif

Я сделал файл Map.c как обычно, написал в нем функцию, которая будет работать, но пока не вызывал функцию в main.c. Я создал структуру данных "карта" в main.c следующим образом:

#include "Player.h"
#include "Map.h"
int main(){
... /// some other stuff being done

map map;
map.x = 0;
map.y = 0;
... /// more stuff being done

callfunctioninplayer(&map, /// other variables///)
}

поэтому я вызываю функцию в player.c, куда я также включил map.h, используя #included "Map.h". Но после попытки скомпилировать выдавало ошибку везде, где я просил структуру map* map с ошибками:


In file included from ./main.c:10:0:
./Player.h:21:55: error: unknown type name ‘map’
 void movementPlayer(int* inputPlayer, player* player, map* map, unsigned int countFrames);

./Player.h:21:55: error: unknown type name ‘map’
 void movementPlayer(int* inputPlayer, player* player, map* map, unsigned int countFrames);
                                                       ^~~
In file included from ./Map.c:10:0:
./Player.h:21:55: error: unknown type name ‘map’
 void movementPlayer(int* inputPlayer, player* player, map* map, unsigned int countFrames);

Я проверил, определен ли везде файл map.h, да, и снова проверил его после помещения структуры карты обратно в player.h. Возвращение в player.h сработало, но почему не в map.h? Извините, если об этом часто спрашивают, я просмотрел несколько сообщений, но не смог найти никого с такой же ошибкой

Источник

Ответы (1)

avatar
dbush
1 июля 2021 в 18:30
7

Похоже, map используется в Player.h, но Map.h не был включен в момент включения Player.h, и, вероятно, вы не включили Map.h в Player.h.

Если Player.h нужны определения в Map.h, вам нужно #include "Map.h" в Player.h.

atiedebee
1 июля 2021 в 18:58
0

Я уже сделал #include "Map.h" во всех файлах (main.c, player.c, map.c), когда появилась ошибка. Помещение его в Player.h действительно решило проблему, когда он больше не распознавался как тип данных. Но ошибка переместилась на структуру плеера, которая также была включена в каждый файл. Добавление player.h и/или map.h в оба файла не решило эти ошибки, хотя они кажутся одинаковыми, но на этот раз нацелены на все указатели player* player в функциях.

dbush
1 июля 2021 в 19:00
2

@atiedebee Тогда похоже, что вам нужно поместить player и map в отдельный заголовок, который включен как в Map.h, так и в Player.h.

atiedebee
1 июля 2021 в 19:06
0

Что ты имеешь в виду? что-то вроде этого? ``` #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED #include "Player.h" #include "Map.h" #endif ``` Извините за форматирование, это обычный заголовок с "Player.h" и "Map.h" включены, это способ сделать это? и включать "Game.h" в каждый файл?

dbush
1 июля 2021 в 19:08
0

@atiedebee Нет, поместите player и map в Game.h, затем включите их в Map.h и Player.h.

atiedebee
1 июля 2021 в 19:09
0

Только структуры или слова?

dbush
1 июля 2021 в 19:09
0

@atiedebee Структуры, поскольку они необходимы в других файлах.

atiedebee
1 июля 2021 в 19:11
0

Ах, хорошо, я попробовал это, и это сработало! Большое спасибо за помощь!

Neil
1 июля 2021 в 19:59
1

Или просто поменяйте порядок: Map.h перед Player.h. Но я согласен; высокая степень связности, вероятно, означает, что они должны быть в одном заголовке.