pliki i include

Dec 09, 2014 11 Replies

Witam.



Mam mniejwiêcej podobny problem.



jest plik plik1.h a w nim #define LEN1 10 #defien LEN2 (LEN1 + LEN3)



i drugi plik plik2.h a w nim #define LEN3 20 #define LEN4 (LEN3 + LEN1)



Da siê te pliki wogóle takie zale¿ne od siebie pliki "zaincludowaæ"? Pozdrawiam Pawe³


W dniu 2014-12-09 15:28, pawel pisze:

Powinno się unikać wzajemnego includowania. Utwórz trzeci plik i tylko jego dołączaj.

Opisz na czym polega problem *rzeczywisty* a prawdopodobnie znajdzie się lepsze rozwiązanie niż kwadratowe koło.

U¿ytkownik "Bool" napisa³ w wiadomo¶ci W dniu 2014-12-09 15:28, pawel pisze:

Ale to nie jest wzajemne includowanie.

Nalezy je w pliku docelowym oba dolaczyc, i w miejscu uzycia symboli LEN2 lub LEN4, bed± one rozwiniête zgodnie z definicjami ...

J.

Ale do³±czam je #include "plik1.h" #include "plik2.h"

i jest b³±d bo w plik1.h nie ma czego¶ takiego jak LEN3 a jak zrobiê na odwrót

#include "plik2.h" #include "plik1.h"

to w plik2.h nie ma LEN1

Pozdr.

Problem rzeczywisty niewiele ró¿ni siê od tego.

mam dwa pliki config.h i input.h

w pliku input.h mam zdefiniowan± strukturê

typedef struct _INPUT INPUT; struct _INPUT { char name[LEN]; .... };

W pliku config.h mam w³a¶nie ten LEN który wykorzystujê te¿ w innych plikach bo ma byæ taki sam wszêdzie. Czyli:

#define LEN 10

Oprócz tego mam te¿ zdefiniowan± strukturê której czê¶ci± jest struktura INPUT

typedef struct _CONFIG CONFIG; struct CONFIG { INPUT wejscie; char name[LEN]; ..... }

I teraz robi±c includ'y w pliku ¼ród³owym jest problem bo input.h nie widzi LEN a na odwrót w config.h nie widaæ INPUT.

Jest na to jaka¶ rada bez tworzenia dodatkowego pliku nag³ówkowego w którym bêdzie tylko #define LEN 10?

Pozdrawiam Pawe³

U¿ytkownik "pawel" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:m67e4q$17q$ snipped-for-privacy@portraits.wsisiz.edu.pl...

Na moje powiniene¶ mieæ trzeci *.h w którym zdefiniujesz LEN. P.G.

U¿ytkownik "pawel" napisa³ w wiadomo¶ci grup dyskusyjnych:m67dnj$vuk$ snipped-for-privacy@portraits.wsisiz.edu.pl...

Jest blad ? O ile pamietam to nie powinno byc, bo te definicje nie sa ani rozwijane, ani sprawdzane. System je tylko zapamietuje do pozniejszego uzytku.

Chyba ze w obu sa uzywane jeszcze innych miejscach niz #define ...

J.

template< unsigned int _Size >

struct _INPUT { char name[ _Size ]; ..... };

Jednak poderzewam że chcesz wielokrotnie inkludować _INPUT zmieniając czasem LEN w róznych miejscach, czy się mylę? Jeśli mam rację to

*ZDECYDOWANIE* templatey.

Dlaczego dodatkowy plik jest problemem skoro jest rozwiązaniem?

A skad wiadomo ze on robi w C++?

A.L.

Niech się wypowie jaki ma kompilator. Jeśli to nie jest system oparty o

8051 z lat 80-tych to przypusczalnie zmiana kompilatora wymaga zmiany gcc na g++ i już. Bez względu na ten mało prawdopodobny problem - inkludowanie innych-ale-tych-samych struktur do różnych jednostek translacji jest prostą drogą do ciezkich bugów. Tego tak robić nie należy. Dlatego chcę wiedzieć do czego to jest - podejrzewam że do czegoś bardzo zlego.

Am 09.12.2014 um 15:28 schrieb pawel:

To zależy od kompilatora i jego preprocesora. Niektóre preprocesory są dwubiegowe i wtedy możesz includować w dowolnej kolejności i będzie działać. W przypadku jednobiegowych masz problem, w szczególności, jak preprocesor nie chce zdefiniować czegoś 2 razy. Wtedy musisz dodać jeszcze jeden include z warunkami. Na przykład taki:

plik_g.h

#define LEN1 10 #define plik_g

a w pozostałych plikach masz:

#ifndef plik_g #include plik_g #endif

ewentualnie plik_g.h #ifndef LEN1 #define LEN1 10 #endif

Waldek

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required