knuto 0 Report post Posted December 16, 2005 Kvifor er det eigentleg slik at ein ikkje skal bruke #include til å inkludere C++-filer som f.eks. inneheld forskjellege klassar? Dette er jo tusen gongar ryddigare enn å bruke ei makefil... (etter mine meiningar) Dessutan fungerer det jo (i alle fall med cygwin) Quote Share this post Link to post
dayslepr 0 Report post Posted December 16, 2005 (edited) heh .. spørsmålet gir ingen mening .. make er et verktøy for å kompilere eller "bygge" programmer (eller biblioteker) #include er en instruksjon til preprocessoren (i kompileren) om å erstatte linjen med #include på med innholdet av filen den refererer til altså to helt forskjellige ting som ikke kan brukes om hverandre i det hele tatt btw. om du finner frem i boka di står det forklart hva som menes med declarations og definitions; forskjellen på disse og hvordan header-filer kommer inn i bildet her .. tipper det egentlig er dette du lurer på (edit: selv om du kanskje ikke vet det selv) Edited December 16, 2005 by dayslepr Quote Share this post Link to post
JBlack 11 Report post Posted December 17, 2005 Riktig måte å kompilere flere filer på er (når man bruker g++): g++ fil1.cpp fil2.cpp fil3.cpp -o fil Man trenger altså ikke bruke make for å kompilere filer, man kan gjøre det med en enkelt kommando. Make og Makefile bruker man for å holde orden på et større prosjekt. En Makefile definerer avhengigheter og hvilke filer som må kompilers på nytt dersom andre filer endres. Det betyr at kompileringen går raskere fordi kun de filer som må kompilers vil bli kompilert. Grunnen til at man ikke inkluderer .cpp filer er at det ford de første ikke er nødvendig, som vist ovenfor. For det andrr blir det rot i større prosjekt. En .cpp inneholder en definisjon av funksjoner og klasser m.m. Denne definisjonen må og skal eksistere kun en gang. Inkluderer men .cpp filen flere ganger i et prosjekt, så blir det kræsj. Dette var en kort og overfladisk forklaring. En grundigere forklaring begynner jeg ikke på her. Quote Share this post Link to post
knuto 0 Report post Posted December 17, 2005 Sant nok. Ein annan ting er jo at det ikkje vil fungere som make der filer som ikkje er endra ikkje blir kompilerte. Men eg syns endå det er ein smule merkeleg at det ikkje f.eks. finst ein ting som dette: #include_once "fil.cpp"; med eit system som i tillegg sjekka at fila ikkje allereie var kompilert. I mitt hovud (som PHP-programmerar) ville det vore mykje enklare, og ein hadde sluppe headerfiler. Ein heilt annan diskusjon som eg òg syns er tåpeleg så lenge eg ikkje har ei god forklaring: Kvifor må plent kompilatoren stoppe fordi det mangler ei tom linje i fila / ei fil? Kvifor kan han ikkje vere så klok at han lager denne linja sjøl? Tåpeleg spør du meg... Quote Share this post Link to post
JBlack 11 Report post Posted December 17, 2005 Men eg syns endå det er ein smule merkeleg at det ikkje f.eks. finst ein ting som dette: #include_once "fil.cpp"; med eit system som i tillegg sjekka at fila ikkje allereie var kompilert. 5303676[/snapback] Det er ikke mulig i et større prosjekt. Når du kompilerer så lages det en objektfil per .cpp fil. Etter kompileringen så samles objektfilene til en kjørbar fil, dette kalles linking. Altså først kompilere, så linke. Når man gjør det med en kommando direkte, så skjer det i bakgrunnen uten at du merker det. Men så kommer poenget: Hver fil kompileres for seg, og kompilatoren vet ikke hva som finnes i andre allerede kompilerte objektfiler. Det vil si at dersom man inkluderer samme .cpp fra to forskjellige steder, så vil man få to objektifiler som inneholder samme definisjonene av de samme funksjonene. Når dette linkes sammen så blir det problemer. Quote Share this post Link to post
Dead_Rabbit 44 Report post Posted December 17, 2005 #ifndef _header_hpp_ #define _header_hpp_ //.. #endif Grunnen til at man legger dette i en .h/.hpp fil er jo nettopp at man skal unngå å inkludere en fil flere ganger enn nødvendig. Så dette blir vel som å gjøre noe alà #include_one, om jeg ikke tar helt feil. (Begynner å bli en stund siden jeg satt meg ordenltig inn i det der ) Quote Share this post Link to post
Atypic 3 Report post Posted December 26, 2005 Riktig, PCD'ene til zirener gjør jobben. Quote Share this post Link to post
dayslepr 0 Report post Posted December 26, 2005 fil1.h: #ifndef FIL1_H #define FIL1_H // kode #endif // Kommentar her; og ingen newline fil1.cpp: #include "fil1.h" #include "fil2.h" // BANG! kanskje zirener gidder å forklare hvorfor det sier (eller kan si, egentlig) «BANG!» her :] Quote Share this post Link to post
dayslepr 0 Report post Posted December 26, 2005 legge til at du bør bruke scons i stedet for make make blir ikke vedlikeholt lengre - og er et helvette å bruke, sammenlignet med scons Quote Share this post Link to post