Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Headerfile und Library

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
18.04.2004, 19:40 Uhr
~Torsten W.
Gast


Hi,

ich hätte mal eine Verständnisfrage. In vielen Fällen ist es notwendig zusätzliche Headerdateien einzubinden. Diese enthalten meines Wissens nur die Prototypen der Funktionen. Ausprogrammiert sind diese in den dazugehörigen Libraries. Ist diese Aussage soweit richtig, oder habe ich da was falsch verstanden?

mfg
torsten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2004, 20:08 Uhr
Pablo
Supertux
(Operator)


Was meinst du mit "ausprogrammiert"?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.04.2004, 23:30 Uhr
DerSchwarzeSchlumpf




Zitat:
Pablo postete
Was meinst du mit "ausprogrammiert"?


ich glaub er meint damit, dass man im header file dem compiler nur sagt: "he, da gibts irgendwo eine funktion mit diesem namen die diesen und diesen parameter nimmt und diesen return-wert liefert. Was genau die Funktion macht sag ich dir dann schon irgendwo". *g*

zB.


C++:
//header.h

void thisIsAVerySpecialFunction(bool this_is_a_bool);



und


C++:
//file.cpp

void thisIsAVerySpecialFunction(bool this_is_a_bool)
{
  if(this_is_a_bool == true)
    cout << "schaut gut aus" << endl;

  else
    cout << "schaut weniger gut aus ;)" << endl;
}



bin selbst noch c++ anfänger, aber ich glaub schon dass das der sinn von den .h-files ist, oder? vor allem wenn man die in andere dateien einbindet weil man die variablen braucht sagt man dem compiler ja dadurch, wo er diese und jene funktion findet, oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.04.2004, 23:50 Uhr
Pablo
Supertux
(Operator)


Wenn du so meinst, dann ja.

Damit du die Implementierung der Funktionen benutzen kannst, musst du sie linken, eigentlich kümmert sich der Compiler darum. Wenn du IDE wie VC++, DEVCPP, Kdevelop, usw benutzt, wird das von der IDE gemacht. Wenn du aber deine Sourcen "zu Fuss" kompilierst, dann musst du dem Compiler mitteilen, wo die Libraries sich befinden. In den Windows Systeme sind die DLL Dateien und unter einem UNIX-Like-System sind die .so Dateien.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 18.04.2004 um 23:53 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.04.2004, 12:13 Uhr
0xdeadbeef
Gott
(Operator)


Beim Programmieren selbst teilt man den Kram in Header- und Source-Dateien auf. Wenn daraus später ne library wird (was ja nicht immer der Fall ist), reicht die Library (also der Binärcode) aus, um Programme damit laufen zu lassen. Um Programme zu entwickeln, die die library benutzen, braucht man die Header, die Sourcen sind dazu nicht zwingend nötig (Wenn auch praktisch, um mal was nachzukucken).

Header sollten idealerweise nur Deklarationen enthalten (mit Ausnahme von templates, natürlich), weil man ansonsten nachher beim Linken Probleme mit doppelten Symbolen kriegt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.04.2004, 14:05 Uhr
RHBaum




Zitat:

Header sollten idealerweise nur Deklarationen enthalten (mit Ausnahme von templates, natürlich), weil man ansonsten nachher beim Linken Probleme mit doppelten Symbolen kriegt.


Naja ... ob man das so stehen lassen kann ?

Also doppelte symbole bekommst nur, wenn im header und im Sourcecode definierst ???. Meinst das ?
Oder wenn du Mehrfach definitionen indirekt einfuegen willst .... besipielsweise Lib A definiert Function x, Lib B benutzt lib a und ist mit ihr gelinkt, Programm C versucht Lib B zu linken (weil funktionenen aus B verwendet werden) und auch A (weil das Programm expliziet noch mal Functionen aus A verwendet) ... = doppelte symbole

Ob man im header/code immer trennen sollte ??? Ich benutz eigentlich recht haeufig Header fuer Hilfsklassen, wo die definition gleich mit im Header ist, auch wenns keine templates sind. Ich spar mir damit das linken, und das geroedel mit den unterschiedlichen bindungen zu den clibs (singlethreaded/multithreated debug/normal) . Dafuer wird der code glaub ich groesser und das compilieren dauert laenger. Bei groesseren Klassen sicher ned zu empfehlen, aber bei wirklich haeufig benutzen Hilfsklassen ???

Ciao...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.04.2004, 16:24 Uhr
~Torsten W.
Gast


Hi,

und erstmal danke für Eure Antworten. Ich weiss nicht genau, ob Ihr mich richtig versteht. Ich rede nicht davon, daß ich selbst Headers erstelle.

Also: Ich hatte ein Beispiel, in dem musste ich eine .h "includen". Zusätzlich wollte der Linker aber die entsprechende .lib haben, die ich dann noch dazulinken musste. Daraus habe ich abgeleitet, das in der .h die Prototypen und in der .lib die vollständige Implementierung enthalten ist.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.04.2004, 16:56 Uhr
RHBaum



@Torsten W.

Fast Genau ....

Wie gesagt gibt 2 moeglichkeiten ...

Du kannst in der H. Datei deine funktion deklarieren ... und sie auch definieren, also coden ....
Wenn du den code fuer alle funktionen / methoden da mitreinpackst brauchst du keine lib mehr mit zupacken. Ist aber nicht sinn der sache bei modularer Programmierung .... :-)

Definierst du in deiner .H datei deine funktionen / Methoden nur, brauchst du den Binaeren code noch dazu, um sie verwenden zu koennen. dieser liegt dann ueblicherweisse in ner Lib (statisch).

Zustaendig fuers zusammenbauen und der Verweise setzen ist der Linker. Der Arbeitet mit sogenannten Symbolen. Diese Symbole sind kryptische zeichenketten mit den namen der Funktionen/methoden drinn, deren Signaturen, und noch anderen Krams. Fuer jede includierte Funktion wird sowas generiert ... und der Linker sucht anhand dieser symbole in den zuglinkten obj dateien (das was der compiler aus deinen c/cpp dateien macht) oder den seperaten Libs (.lib) nach diesen funktionen, merkt sich deren relative position als einsprungpunkt in den binaeren code und setzt diesen Einsprungspunkt an alle stellen wo das Symbol als Aufruf vorkommt (dann wenn er die exe/dll(windows) oder das binary(unix etc...) erzeugt). Beim compilieren zu obj oder lib files werden die symbole also auch schon erzeugt und in der binaeren datei hinterlegt.

Findet er das symbol nicht, kommt der beruchtigte "unresolved symbols" Fehler !

Definierst du eine Funktion komplett im header, wird der code beim erzeugen der obj datei aus der cpp datei erzeugt, die den header includiert. Weiss jetzt nicht genau ob der das nur einmal macht, beim ersten include der h. datei, oder ob er den code der funktionen aus der h. datei bei jeder cpp datei mit in die obj. datei wirft, die die h. datei includiert ....

verwirrend ??? Naja, vielleicht kanns wer verstaendlicher erklaeren .. :p

Ciao ...

Dieser Post wurde am 19.04.2004 um 17:01 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.04.2004, 21:37 Uhr
~Matze
Gast


Hallo,

ich war bislang nur stiller Mitleser Eures Forums und finde es echt super wie hier geholfen wird. Nun muss ich mich allerdings mal selbst zu Wort melden

1.) Die Verwendung von Prototypen nicht zwingend notwendig.
2.) Die Standardlibraries werden automatisch mitgelinkt.

Sofern meine beide Aussagen stimmen, gibt sich für mich folgende Frage:
//Am Beispiel math.h
Im Headerfile stehen nur die Prototypen. Die eigentliche Library wird als Standardlibrary mitgelinkt. Warum muss ich jetzt die math.h includen, wenn doch die Verwendung von Prototypen nicht zwingend notwendig ist.

An sich müsste der Compiler bzw. Linker anhand der Standardlibraries alle Funktionen auch ohne Prototypen finden?

Habe ich irgendwo einen Denkfehler?

Gruss
Matze
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.04.2004, 10:40 Uhr
typecast
aka loddab
(Operator)


Einerseits hast du damit recht, dass Prototypen nicht zwingend notwendig sind, andererseits aber auch nicht.

Prototypen brauchst du dann nicht, wenn du die Funktion gleich vor der ersten Verwendung definierst (also den Codeblock programmierst)

JEDE Funktion muss dem Compiler vor der Verwendung bekannt sein (damit er Typüberprüfungen vornehmen kann....)

Du solltest dir noch klarmachen, dass der Compiler und der Linker zwei Unterschiedliche Programme sind. Zuerst geht der Compiler über das Programm drüber dann der Linker. Dabei schaut sich der Compiler nicht an, was in den Librarys steht. Er sucht nur nach den Prototypen. Er überlässt es dem Linker sich davon zu überzeugen, dass die Fuktionen die Durch Prototypen deklariert worden sind, auch implementiert wurden

Was das angeht, dass die Librarys automatisch mithgelinkt werden, hast du recht. Allerdings ist das nicht vorgeschrieben (dient nur zu deiner Bequemlichkeit). Davon weiß der Kompiler aber nichts. Deshalb musst du die header-Dateien einbinden.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: