ďťż

Ładny brzuch

Witam. Mam dziwny problem z plikami nagłówkowymi. Powiedzmy, że mam 3 pliki nagłówkowe: plik1.h, plik2.h, plik3.h w których są definicje jakichś tam klas, a pliki wyglądają jakośtak:
//---plik1.h--- #ifndef PLIK1_H #define PLIK1_H #include plik2.h /* ... */ #endif //PLIK1_H //---plik2.h--- #ifndef PLIK2_H #define PLIK2_H #include plik3.h #include plik1.h /* ... */ #endif //PLIK2_H //---plik3.h--- #ifndef PLIK3_H #define PLIK3_H #include plik2.h /* ... */ #endif //PLIK3_H
w plikach tych są deklaracje jakichś tam klas itp. (nie umieszczałem swojego kodu bo jest dość długi a i tak nic nowego do problemu nie wnosi)

Więc problem jest taki, że w pliku plik2.h nie mogę używać typu klasy zadeklarowanej w plik3.h, tak jakby ten plik wogole się nie dołączał do plik2.h
Dopiero jak z plik1.h wywale #include plik2.h to zacznie dzialac normalnie, ale nie moge tego zrobic w swoim programie. Pisze w Visual Studio.



Hmm, może:
#include "plikn.h"
Chodzi o cudzysłowy.

nie, o cudzyslowach to zapomnialem, jak pisalem to pytanie, bo pisalem ten prosty kod odrazu w przegladarce tak zeby tylko uchwycic idee. Nie wiem moze cos jest nie tak z moim visual'em, wkoncu uzywam bety 2008 ;) Poeksperymentuje z tym pozniej jeszcze w jakims innym srodowisku, bo cos mi sie to dziwne wydaje. Narazie poradzilem sobie dodajac tak jakby #include "plik1.h" w pliku plik2.cpp zamiast plik2.h ;)

A jednak to nie wina visual'a zrobilem sprawdzilem to w dev c++ i tez sie nie kompiluje. Napisalem taki przykladowy program:
plik1.h
#ifndef PLIK1_H #define PLIK1_H #include "plik2.h" class c1 { int a; int b; }; #endif //PLIK1_H
plik2.h
#ifndef PLIK2_H #define PLIK2_H #include "plik1.h" #include "plik3.h" class c2 { c3 s; int c; int d; }; #endif//PLIK2_H
plik3.h
#ifndef PLIK3_H #define PLIK3_H #include "plik2.h" class c3 { int e; int f; }; #endif //PLIK3_H
plik1.cpp
#include "plik1.h"
plik2.cpp
#include "plik2.h"
plik3.cpp
#include "plik3.h"
main.cpp
#include "plik1.h" #include "plik2.h" #include "plik3.h" int main() { c1 a; c2 b; c3 c; }
W dev c++ wywala mi ze c3 nie jest nazwa typu. Wie ktos dlaczego? przeciez dolaczylem plik3.h. Po za tym jak wywale z plik3.h dolaczanie pliku plik2.h to sie skompiluje!



cykliczne include'owania kodu - jak widzisz, cos takiego nie moze dzialac w ten sposob :) zastanow sie jak po kolei kompilator traktuje kod, to zrozumiesz czemu ;] zawsze powinno sie pisac kod tak, zeby kod include'owal pliki tylko w jedna strone, a nie zeby include'owaly sie nawzajem.

ok, no jak widac nie mozna includowac cyklicznie, ale wydaje mi sie to troche dziwne, bo moje pliki naglowkowe sa zrobione tak zeby byly dolanczane tylko raz (dyrektywy #ifndef, #define i #endif). No ale moze ja rozumuje troche inaczej niz moj preprocesor :) Jak uzywam #pragma once to dzieje sie tak samo jak z tymi ifami

#pragma once robi dokladnie to samo, co ta konstrukcja z ifndef, wiec tak samo nie dziala. a czemu? preprocesor to bardzo prymitywne narzedzie - on po prostu bierze plik, i wstawia jego zawartosc do innego pliku. niczego nie analizuje. wiec co sie dzieje:
zalozmy ze z pliku .cpp include'ujesz plik1.h
-PLIK1_H nie jest zdefiniowane, wiec preprocesor wchodzi w glab pliku, oznaczajac PLIK1_H jako zdefiniowane
-preprocesor napotyka dyrektywe include plik2, wiec przechodzi do pliku2
-PLIK2_H nie jest zdefiniowane, wiec preprocesor wchodzi w glab pliku, oznaczajac PLIK2_H jako zdefiniowane
-preprocesor napotyka dyrektywe include plik1, wiec przechodzi do pliku1
-PLIK1_H jest zdefiniowane, wiec kompilator omija include'owanie tego pliku (tu jest caly feler...)
-pozniej wykonuje pozostale include'y, ale to nie wazne, bo teraz analizujac plik2 kompilator nie bedzie znal zawartosci plik1 - ta zawartosc zostanie (czy raczej zostalaby) przetworzona dopiero, gdy kompilator przetworzy plik2 i plik3, i zawartosc tych plikow wstawi w miejsce include'a w plik1.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •