ďťż

Ładny brzuch

witam mam pytanie jak uzywac dyrektywy #include" "

chodzi o cos takiego
mam pliki stworzone w builderze (nie jestem pewien czy to ma jakies znaczenie)
unit1.h unit2.h unit3.h no i oczywiscie to samo z rozszezeniem cpp.

no i teraz najwazniejsze w pliku:

unit1.h
#include"unit2.h"
#include"unit3.h"

unit2.h
#include"unit1.h"
#include"unit3.h"

unit3.h
#include"unit2.h"
#include"unit3.h"

ale ja juz sam nie wiem czy to tak ma byc bo przy 2 plikach dzialalo ale jak doszlo unit3 przestalo i wypisuje "include files nested too deep"
za gleboko ?? nie rozumiem. Moze ktos z was wie jak to sie powinno robic z gory dzieki :)




witam mam pytanie jak uzywac dyrektywy #include" "

chodzi o cos takiego
mam pliki stworzone w builderze (nie jestem pewien czy to ma jakies znaczenie)
unit1.h unit2.h unit3.h no i oczywiscie to samo z rozszezeniem cpp.

no i teraz najwazniejsze w pliku:

unit1.h
#include"unit2.h"
#include"unit3.h"

unit2.h
#include"unit1.h"
#include"unit3.h"

unit3.h
#include"unit2.h"
#include"unit3.h"

ale ja juz sam nie wiem czy to tak ma byc bo przy 2 plikach dzialalo ale jak doszlo unit3 przestalo i wypisuje "include files nested too deep"
za gleboko ?? nie rozumiem. Moze ktos z was wie jak to sie powinno robic z gory dzieki :)

nie to literowka tam jest

unit3.h
#include "unit1.h"
#include "unit2.h"

Teraz już jasne: ja to nazywam zapętleniem nagłówków. Występuje gdy masz za duże zamotanie includów. Dyrektywa #include to nic innego jak rozkaz: "Wklej tu UnitX.h i przeleć jego kod". Najlepiej umieść wszystkie includy ZA taką dyrektywą
#ifndef _UNITX_H_ #define _UNITX_H_ ...
Wtedy jest najbezpieczniej.



Real_Noname: poprawka
#ifndef __UNIT_X_H__
#define __UNIT_X_H__

//tutaj kod pliku .h

#endif //__UNIT_X_H__

Nie zapominajmy o #endif.
To jest tak zwana warunkowa kompilacja. I żeby nie było żadnego niedomówienia, to pliki .h powinny się zaczynać #ifndef a kończyć #endif - nie umieszczaj tego przypadkiem w .cpp .

Najlepiej rzuć Buildery i zacznij się uczyć C++. Proponuję i gorąco polecam kurs C++ w "Megatutorial - Od Zera Do Gier Kodera" - www.avocado.risp.pl

//EDIT: ojej, mialo być #ifndef, a nie #ifdef ;)
Użytkownik TeMPOraL edytował ten post 30 maj 2005, 20:05
wiesz co ja zauwazylem ze faktycznie ma znaczenie to w ktorym miejscu jest umiesczone to include ale ja to robilem jako eksperyment raz tu raz tam :) i zawsze kiedys to zaczynalo dzialac hehe ale wlasnie chcialem sie dowiedziec jak to sie powinno robic. Dzieki wielki za wytlumaczenie

W nowszych kompilatorach powinno wystarczyć

#pragma once

ale dla pewności ja też używam systemu #ifndef <-> #define

// podoba mi się to kolorowanie kodu a'la TeMPOraL :)

Żeby było wszystko jasne - dyrektywy #pragma są dyrektywami zależnymi od danego kompilatora, i dołączonego do niego preprocesora. Innymi słowy, np. w Microsoft Visual C++ możemy stosować np:
#pragma once
#pragma comment(lib, "nazwa dolaczanego liba")
i tym podobne, ale napewno nie skompilują się one pod np. opartym na MinGW używanym w Dev-C++, ani nawet Borland Builderze. Pragmy to dyrektywy wysoce nieprzenośne, więc używa się ich tylko wtedy, gdy na 100% nie chcemy zachować przenośności, lub w szczególnych przypadkach [jak np. w MSVC++ wyłączanie niektórych komunikatów o błędach podczas kompilacji programu używającego STL w trybie Debug].

Dlatego o wiele lepszym - bo przenośnym i dla wszystkich zrozumiałym - rozwiązaniem jest używanie warunkowej kompilacji, czyli serii #ifndef-#define-#endif

Pozdrawiam.

//EDIT: ojej, tu także mialo być #ifndef, a nie #ifdef ;)
Użytkownik TeMPOraL edytował ten post 30 maj 2005, 20:04
Okej, ale pozwół że zacytuję kawałek z megatutorialu Xiona ;)


[...]
Mnie osobiście rozwiązanie to wydaje się po prostu nieeleganckie - zwłaszcza, że coraz więcej kompilatorów oferuje inny sposób. Jest nim umieszczenie gdziekolwiek w pliku dyrektywy:

#pragma once

Jest to wprawdzie polecenie zależne od kompilatora, ale obsługiwane przez wszystkie liczące się narzędzia (w tym także Visual C++ .NET oraz kompilator GCC z Dev-C++). Jest też całkiem prawdopodobne, że taka metoda rozwiązania problemu wielokrotnego dołączania znajdzie się w końcu w standardzie C++.


No ale ta nieelegancka dla Xiona metoda (#ifndef - #define - #endif) powinna się jednak znaleźć w kodzie obok #pragma once jako gwarancja przenośności kodu.

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