Dzielenie kodu na kilka plików źródłowych - "struktury globalne" a kilka plików
Ostatnio zmodyfikowano 2012-09-27 22:23
tariel36 Temat założony przez niniejszego użytkownika |
Dzielenie kodu na kilka plików źródłowych - "struktury globalne" a kilka plików » 2012-09-25 01:46:18 Witam,
Po pierwsze, nie jestem pewien czy wybrałem dobry dział (problem chyba wykracza lekko poza samą lekcje), jeśli tak jest, to przepraszam i prosiłbym o przeniesienie.
Problem: Staram się podzielić mój kod na kilka plików. Mam kilka struktur które są używane w całym programie przez różne funkcje. W kursie jest poruszony problem struktur i funkcji ale ograniczający się tylko do 3 plików (main.cpp, "funkcje.hpp i funkcje.cpp"). Ja staram się podzielić kod na więcej plików.
Powiedzmy że mam zestaw: main.cpp globals.hpp funkcje_x.cpp i .hpp funkcje_y.cpp i .hpp
W pliku main.cpp wiadomo główne ciało programu. W pliku globals.hpp przechowuje kilka definicji oraz kilka struktur. W plikach funkcje_x.cpp i funkcje_y.cpp znajdują się funkcje korzystające ze struktury znajdujących się w pliku globals.hpp
I teraz pojawia się problem:
Kiedy w pliku main.cpp zastosuję taką operacje: #include "globals.h" #include "funkcje_x.hpp" #include "funkcje_y.hpp" Kompilator nie odnajduje tych struktur, także kolejny pomysł który przyszedł mi do głowy to dołączenie pliku globals.hpp do plików funkcje_x.hpp i funkcje_y.hpp. Niestety kiedy dołączę to do obydwu plików nagłówkowych kompilator zwraca mi redefinicje struktur -> program się nie kompiluje. Kiedy dołączę globals.hpp tylko do jednego z nich, to wiadomo, drugi nie znajduje struktur.
Jak rozwiązać ten problem?
Czy powinienem złączyć obydwa pliki funkcje_x.cpp i funkcje_y.cpp w 1 i wtedy zaimplementować struktury w 1 pliku nagłówkowym? Tylko że po jakimś czasie pewnie znów trafie na ten problem, także ten sposób raczej odpada. |
|
DejaVu |
» 2012-09-25 04:24:23 Zapewne w globals.hpp dołączasz function_x.hpp bądź function_y.hpp - dlatego się nie kompiluje. Nie można robić cyklicznych odwołań do plików nagłówkowych (jeżeli przyjmiesz, że wierzchołkami są pliki *.hpp, a krawędziami skierowanymi dyrektywy #include to nie może powstać w grafie cykl). Wspomniany problem cykli nie jest rozpatrywany w plikach *.cpp, ponieważ kompilator sobie z tym radzi. |
|
tariel36 Temat założony przez niniejszego użytkownika |
» 2012-09-25 12:49:57 Niestety w globals.hpp mam dołączone tylko biblioteki, żadnych plików nagłówkowych zrobionych przez moją osobę :( |
|
DejaVu |
» 2012-09-25 17:20:28 Weź kartkę i rozrysuj na niej powiązania między własnymi plikami *.hpp - musi być gdzieś cykl, że się nie kompiluje. Drugą opcją jest po prostu brak dowiązania do pliku w którym są definicje struktur/deklaracje funkcji. |
|
tariel36 Temat założony przez niniejszego użytkownika |
» 2012-09-26 22:05:18 No nie jestem w stanie tego rozgryźć nawet po odrysowaniu układu: http://i166.photobucket.com/albums/u107/tariel36/WYKRES.png Może gdzieś w definicjach popełniłem błąd: globals.hpp: #ifndef globals_hpp #define globals_hpp #include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <fstream> using namespace std; #define C_BS 10 #define C_RS 10 #define C_PS 2
struct g_struct { int eg; int pt; int me;
}; g_struct g_ctrl;
struct b { int id; string ne; int php; }; b bs[C_BS];
struct r { int id; string ne; int ie;
}; r rs[C_RS];
struct ps { int id; string ne; int hp;
}; ps p[C_PS]; #endif
main.cpp: #include "globals.hpp" #include "funkcje_y.hpp" #include "funkcje_x.hpp" //normalny kod
funkcje_x.hpp #ifndef funkcje_x_hpp #define funkcje_x_hpp void p_a(); void p_bl(); void p_re(); #endif funkcje_x.cpp #include "funkcje_x.hpp" //reszta kodu funkcje_y.hpp #ifndef funkcje_y_hpp #define funkcje_y_hpp int p_t_p(int p_pis, int f_pis); void load_files(); #endif funkcje_y.cpp #include "funkcje_y.hpp" //funkcje |
|
DejaVu |
» 2012-09-26 22:12:15 Bez logu kompilacji nic nie jesteśmy w stanie powiedzieć. |
|
cyklopek11 |
» 2012-09-26 22:46:59 Z ciekawości zbudowałem kilku plikowy projekt w Code::Blocks z kodem który wkleiłeś powyżej i ... projekt buduje się bez problemów.
W Visual Studio 2010 też się buduje...Wprowadziłeś mnie w błąd zawartość plików różni się od tego co napisałeś w pierwszym poście. Działa dopiero jak wy-externujesz jak napisał Admixior. Przed: potrzeba jeszcze deklaracji zapowiadającej: |
|
Admixior |
» 2012-09-26 23:16:08 Ja obstawiam że musisz przenieść definicje globalne (obiektów) takie jak tablice czy pojedyncze elementy np:g_struct g_ctrl; do plików cpp. Plików nie dołączać do nagłówków tylko wstawić do projektu. A w nagłówkach napisać deklaracje zmiennych globalnych np.: extern g_struct g_ctrl; |
|
« 1 » 2 |