У меня есть программа, распределенная по трем разным файлам 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? Извините, если об этом часто спрашивают, я просмотрел несколько сообщений, но не смог найти никого с такой же ошибкой
Я уже сделал
#include "Map.h"
во всех файлах (main.c, player.c, map.c), когда появилась ошибка. Помещение его вPlayer.h
действительно решило проблему, когда он больше не распознавался как тип данных. Но ошибка переместилась на структуру плеера, которая также была включена в каждый файл. Добавление player.h и/или map.h в оба файла не решило эти ошибки, хотя они кажутся одинаковыми, но на этот раз нацелены на все указателиplayer* player
в функциях.@atiedebee Тогда похоже, что вам нужно поместить
player
иmap
в отдельный заголовок, который включен как в Map.h, так и в Player.h.Что ты имеешь в виду? что-то вроде этого? ``` #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED #include "Player.h" #include "Map.h" #endif ``` Извините за форматирование, это обычный заголовок с "Player.h" и "Map.h" включены, это способ сделать это? и включать "Game.h" в каждый файл?
@atiedebee Нет, поместите
player
иmap
в Game.h, затем включите их в Map.h и Player.h.Только структуры или слова?
@atiedebee Структуры, поскольку они необходимы в других файлах.
Ах, хорошо, я попробовал это, и это сработало! Большое спасибо за помощь!
Или просто поменяйте порядок:
Map.h
передPlayer.h
. Но я согласен; высокая степень связности, вероятно, означает, что они должны быть в одном заголовке.