Gå til innhold

Kvifor ikkje inkludere C++-filer?


Anbefalte innlegg

Videoannonse
Annonse

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)

Endret av dayslepr
Lenke til kommentar

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.

Lenke til kommentar

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... :p

Lenke til kommentar
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.

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...