«Ошибка: неизвестное имя типа» - Использование псевдонима структуры в объявлении функции - PullRequest
0 голосов
/ 26 мая 2018

В файле: "priority_queue.h" я определил структуру:

#include "astar.h"
typedef struct p_q{
struct astar_node* first;
struct astar_node* last;
int size;
 }P_Q;

Файл "astar.h" выглядит так:

#include "priority_queue.h"

typedef struct astar_node{
struct astar_node* next;
struct astar_node* prev;
struct astar_node* PQ_next;
struct astar_node* PQ_prev;
int x;
int y;
int c;
int h;
int tot_cost;
}Astar_node;

int func(P_Q* P);

ПочемуЯ получаю сообщение об ошибке: «Неизвестное имя типа« P_Q »?

Если я переопределяю« funk () »на:

 int func(struct p_q* P);

, ошибка исчезает, но я получаю предупреждение:» Описание Путь к ресурсуТип местоположения 'struct p_q', объявленный внутри списка параметров, не будет виден вне этого определения или объявления "

Кто-нибудь знает почему?

1 Ответ

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

Ваши включения являются круглыми, то есть priority_queue.h включает astar.h, что включает priority_queue.h.Этого вам следует избегать.

Попробуйте изменить:

#include "astar.h"
typedef struct p_q{
    struct astar_node* first;
    struct astar_node* last;
    int size;
} P_Q;

на

// Forward declaration
struct astar_node;

typedef struct p_q{
    struct astar_node* first;
    struct astar_node* last;
    int size;
} P_Q;

Вы можете сделать это, потому что используете только указатели до struct astar_node внутри priority_queue.h.Поэтому компилятору не нужно знать, что находится внутри struct astar_node.Все, что нужно знать, это то, что где-то в вашем проекте есть структура с именем astar_node.

...