Redefinicja typów danych, pliki nagłówkowe

0

Cześć,
mam kilka plików nagłówkowych. W jednym z nich jest zdefiniowana struktura listy dwukierunkowej (list.h). W innym pliku mam nagłówki funkcji pomocniczych (helper.h), jedna z nich ma zwracać taką listę, ale typ listy nie jest w tamtym miejscu znany. Gdy robię w helper.h

#include "list.h"

to dostaję błąd, że próbuję ponownie zdefiniować strukturę.

list.h

typedef struct node
{
   char *val;
   struct node *prev;
   struct node *next;
} node;

typedef struct list
{
   node *head;
   node *tail;
} list;

helper.h

// include "list.h"
list *get_string(FILE *); // tu jest problem, ponieważ typ list nie jest znany

Jest na to jakiś sposób, czy muszę wszystko dać w jednym pliku (chciałbym tego uniknąć)?

0

W helper.h deklarowane są operacje na tych strukturach które są zadeklarowane w list.h z tego wynika że jest naturalnym podłączenie tych struktur czyli list.h
Ale zastanów się nad tym czy gdziekolwiek kiedykolwiek i ktokolwiek będzie potrzebował tych struktur ale bez operacji nad nimi?
Skoro nie, to wsadź te prototypy funkcji bezpośrednio do list.h jak to robią normalni programiści.

0

Zapewne w pliku glownym robisz cos takiego:

#include "1.h"
#include "2.h"

I dwukrotnie dolaczasz plik 1.

Rozwiazanie:

#ifndef BLABLA
#define BLABLA
typedef struct node
{
   char *val;
   struct node *prev;
   struct node *next;
} node;
 
typedef struct list
{
   node *head;
   node *tail;
} list;
#endif // BLABLA
0
_13th_Dragon napisał(a):

W helper.h deklarowane są operacje na tych strukturach które są zadeklarowane w list.h z tego wynika że jest naturalnym podłączenie tych struktur czyli list.h. Ale zastanów się nad tym czy gdziekolwiek kiedykolwiek i ktokolwiek będzie potrzebował tych struktur ale bez operacji nad nimi?

W pliku list.h mam prototypy funkcji do operacji na listach (dodawanie elementów, usuwanie, itp.), ale gdzie indziej mam też funkcje, które korzystają z list, ale nie są ściśle powiązane z samymi listami, więc mieszanie tego raczej nie jest dobrym pomysłem.

_13th_Dragon napisał(a):

Skoro nie, to wsadź te prototypy funkcji bezpośrednio do list.h jak to robią normalni programiści.

Jestem nienormalnym programistą? :)

Skorzystałem z pomysłu n0name_l i jestem zadowolony. Dzięki.

0

Mozesz umiescic deklaracje zapowiadajaca przed tym fragmentem: list *get_string(FILE *);
Jak widac zwracany jest tutaj wskaznik wiec kompilator nie musi znac ciala struktury

0
_13th_Dragon napisał(a):

Ad1: A realizacja tych nie ściśle związanych z listą funkcji odbędzie się bez uczestnictwa tych związanych z listą?

Czy jak mamy, np. pisać kalkulator ONP, gdzie skorzystamy ze stosu, to nagłówki funkcji pop, push, itp. umieści w pliku calc.h, czy stack.h?

_13th_Dragon napisał(a):

Ad2: Czy kierowca który dopiero wsiadł za kółko jest normalnym kierowcom?

A ma prawo jazdy? Poza tym niektóre starsze osoby mają prawko, jeżdżą autem, a nie powinny. To chyba zły przykład...

1 użytkowników online, w tym zalogowanych: 0, gości: 1