Ĺ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
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.