Jump to content
Sign in to follow this  
knuto

Kvifor ikkje inkludere C++-filer?

Recommended Posts

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)

Share this post


Link to post

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 by dayslepr

Share this post


Link to post

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.

Share this post


Link to post

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

Share this post


Link to post
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.

Share this post


Link to post

#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 :p)

Share this post


Link to post

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 :]

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...