Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wie funktionieren die standard libraries???

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 <
000
08.11.2004, 09:12 Uhr
Vedi



Schaut man sich zum beispiel math.h an erwartet man (oder zumindest ich), dass man dort die definitionen zu den einzelnen mathe funktionen finden wuerde. zum beispiel einen loop fuer die berechnung von 'sqrt' oder eine unendlich-summenfunktion fuer 'sin' also mathematische definitionen umgewandelt in c++ code. aber wie ich zu meiner grossen verwirrung beim blick in maht.h feststellen musste gibt es in math.h kein einziges + oder - geschweige denn komplexere mathematische funktionen. nur definitionen uerber definitionen. alle math.h funktionen werden nirgends definiert sondern einfach benutzt. heisst dass, dass diese definitionen in noch niedrigeren ebenen definiert sind? wuerde dass denn nicht bedeuten dass man diese dann auch ohne vorher math.h zu erwaehnen in seinem .cpp file benutzen koennte??? wenn dem so ist wozu dient denn math.h ausser um diese funktionen float, double und long double - "faehig" zu machen?
Gruss Vedi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.11.2004, 09:24 Uhr
kronos
Quotenfisch
(Operator)


Guten Morgen,

Zitat von Vedi:
Schaut man sich zum beispiel math.h an erwartet man (oder zumindest ich), dass man dort die definitionen zu den einzelnen mathe funktionen finden wuerde.

Definitionen haben im header nichts zu suchen (zumindest bei C). Die Definitionen sind in diesem Fall schon kompilieren (in libm.a unter linux bzw. libmath.irgendwas unter windows).


Zitat:
wuerde dass denn nicht bedeuten dass man diese dann auch ohne vorher math.h zu erwaehnen in seinem .cpp file benutzen koennte???

Wenn du die library dazulinkst, bekommst du bei den meisten compilern höchstens ein warning.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2004, 09:41 Uhr
Vedi



beim tutorial von cplusplus.com findet man folgendes als beispiel fuer sqrt:


Zitat von Verfasser:

Example.


/* sqrt example */
#include <stdio.h>
#include <math.h>

int main ()
{
double param, result;
param = 1024.0;
result = sqrt (param);
printf ("sqrt(%lf) = %lf\n", param, result );
return 0;
}

Output:
sqrt(1024.000000) = 32.000000


ist denn math.h nicht "dazugelinkt" oder reden wir an einander vorbei?
eine datei 'libm*.*' finde ich nicht auf meinem computer(windows).
wie koennte es denn anders heissen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.11.2004, 11:36 Uhr
virtual
Sexiest Bit alive
(Operator)


Hallo,

Du must in C/C++ zwischen Deklaration und Definition unterscheiden:

C++:
double sqrt(double);


Ist eine Deklaration,

C++:
double sqrt(double) {
   Code hier
}


Ist dagegen eine Definition. In headern stehen nur Deklarationen. (Sofort einleuchtend dürfte sein, daß jede Definition auch eine Deklaration ist; eine Deklaration jedoch nicht zwingend eine Definition ist). Der Sinn von Deklarationen ist, dem Compiler mitzuteilen, welche Parameter typen eine Funktion erwartet und welchen Rückagebtypen sie hat.

Sicherlich könnte man, jedenfalls theoretisch betrachtet, auf die Trennung von Deklarationen und Definitionen verzichten, aber wenn man das machen würde, dann müsste man stets die Definitionen zur Hand haben (also in letzter Konsequenz den Sourcecode) und diesen auch immer compilieren.
Abgesehen von dem Erhöhten Zeitaufwand, den das Compilieren nach sich ziehen würde, gibt es nach wie vor noch einige populäre Betriebssysteme, die nicht Opensource sind, also wo der Sourcecode nicht verfügbar ist.

Also geht man hin, teil dem compiler (mit Hilfe der Header) mit, wie denn die Funktionen so aussehen, die man aufrufen will. Der Compiler compilert ganz kräftig und erstellt (manchmal intern, manchmal für den User sichtbar) eine Zwischendatei, die Objektdatei. Eine solche Objektedatei ist verienfacht gesprochen, Dein Source in einem Compilierten format, wobei allerdings da noch Platzhalter drin sind: zB wusste der Compiler ja nicht, wie sqrt innen drin aussieht und ist daher hingegangen und hat an die fragliche Stelle in der Objektdatei einen Vermerk eingebaut "sqrt bitte hier einfügen".

nachdem der Compiler kompiliert hatte, geht der ganz Kram an den Linker. Der Linker kümmert sich genau um diese Verweise und bindet die Bibliotheken dazu, in deinem Fall eben eine, die sqrt enthält.

Zwar mag es für die auf den Ersten Blick so aussehen, als würde alles in einem Durchlaufgemacht werden: es ist aber tatsächlich so, daß du einen Compiler und einen Linkerdurchlauf hast (eigentlich sinds noch mehr, aber die tun hier nichts zur sache). Der Compiler braucht an keiner Stelle zu wissen, wie sqrt innen drin aussieht. Der Linker braucht das eigentlich auch nicht zu wissen (sqrt könnte ja auch in einer anderen Sprache geschrieben sein). Der Linker weiss einfach nur: es gibt eine Library, da gibt es ein srt drin. Das bindet er eben dazu. Hier gibt es unterschiedliche Modelle, eine ausführliche diskussion führt an dieser stelle zu weit.

Bleibt noch die Frage, woher weiss der Linker, in welcher Library welche Funktion steht? - Im zweifel weiss er es nicht und man muß es ihm sagen. Bei so Standardfunktionen verfügt der Linker über eine Liste von Standardlibraries, die er automatisch linkt. Der Name dieser Libraries ist nicht standardiesiert und unerheblich, solange es keine Probleme gibt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 08.11.2004 um 11:36 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.11.2004, 12:34 Uhr
Vedi



wenn es also in math.h nur DEKLARATIONEN gibt wo stehen die DEFINITIONEN der DEKLARIERTEN funktionen??? wo steht also der algorithmus fuer die berechnung von zb sqrt? denn so wie ich das sehe dient math.h nur dazu um den ganzen mathematischen funktionen eine 'form' zu geben und ist nicht unbedingt fuer die berechnung zustaendig was uns zu der frage bringt: kann mann sqrt(int, float, double oder was auch immer); in irgendeiner form, auch ohne vorher #include <math.h> geschrieben zu haben, benutzen? es laege doch nahe da sqrt nicht in math.h DEFINIERT wird zu schlussfolgern, dass sqrt (bis auf den prefix/infix unterschied) mal generell gesehen genauso zu "c++" (in was fuer immer einem teil davon) dazugehoert wie der '+' operator.
wenn dem NICHT so waere dann haetten wir folgendes:
1. sqrt() ist keine 'basis-funktion' von c++
2. im .cpp file ist die zeile #include <math.h> vorhanden!
3. in math.h ist die 'funktion' sqrt() nicht DEFINIERT!
4. math.h bezieht keine weiteren header (oder ueberhauptwelche anderen) files mit ein
_______________________________________________
Wie wird denn sqrt() dann ausgefuehrt?

wenn jedoch meine vermutung richtig ist dann wuerde das doch heissen dass math.h nicht 'ueberlebensnotwendig' ist und es nur als 'schminke' oder vereinfachung dient.
gruss Vedi
ps: wie sieht es denn mitden anderen standard includes aus?

Dieser Post wurde am 08.11.2004 um 12:37 Uhr von Vedi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.11.2004, 12:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wie virtual schon sagte, die definition von sqrt ist in einer DER standard-libraries, von denen JEDER compiler welche hat, aber die jeweils unterschiedlich heißen. Wenn du z.b unter Windows eine "Konsolenanwendung" erstellst (z.b die DevCPP, VC, o.ä) dann fügt der Linker dir automatisch die Standardlibraries hinzu, in denen z.b auch die Definition von sqrt drin steht. Wenn du math.h in diesem fall nicht inkludierst, weiß aber der Compiler nicht WIE sqrt denn aussehen wird (also nur von der deklarationsseite, also welche parameter es erwartet, usw) Deshalb schmeisst er dann ohne math.h einen fehler das er die funktion nicht kennt. Würdest du z.b die Deklaration von sqrt aus math.h in deinen Quellcode einfügen, dann weiß der Compiler: Jawoll so sieht sqrt aus. Wo die Definition der Funktion liegt, ist dem Compiler dann egal! Der Linker sucht sich dann die sogenannten "abhängigkeiten" zusammen und "kopiert" dir die definition von sqrt aus den Standardbibliotheken in dein Programm.

Wenn man, mal angenommen, Funktionen der OpenGL-Library verwenden will (welche keine Standardlib ist) muss man die Library mitlinken, da sonst der Linker meckert, das er zwar eine Deklaration von einer GL-Funktion hat, aber keinerlei Definition davon.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.11.2004, 12:51 Uhr
Vedi



Endlich auf den punkt gebracht!!!

DANKE!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.11.2004, 12:53 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Vedi:

wenn jedoch meine vermutung richtig ist dann wuerde das doch heissen dass math.h nicht 'ueberlebensnotwendig' ist und es nur als 'schminke' oder vereinfachung dient.

Scharf beobachtet: Man kann auf Header in der C Welt verzichten; in der C++ Welt schaut es etwas anders aus, weil sich hier nicht zu allen Definitionen Forwarddeklarationen (== Deklarationen ohne Definitionsanteil) bilden lassen. Zu den übrigen Fragen siehe mein vorheriges Post bzw. Flosofts Post.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.11.2004, 23:31 Uhr
ao

(Operator)



Zitat von virtual:
Scharf beobachtet: Man kann auf Header in der C Welt verzichten ...

... sollte man aber nicht! Niemals. Ich würde so weit gehen, zu behaupten, dass es ein Designfehler der Sprache C ist, dass sie Funktionsaufrufe ohne Prototyp gestattet.

Nur wenn Prototypen vorhanden sind, kann der Compiler zweifelsfrei sehen, wie Funktionen aufgerufen werden (Anzahl und Typ der Argumente, Typ des Rückgabewertes, ggfs. Aufrufkonventionen).

Wenn der Prototyp fehlt, muss der Compiler versuchen, aus dem Kontext zu raten, und dabei kann einfach zuviel schiefgehen. Und es macht überhaupt keinen Spaß, solche Fehler zu debuggen.

Gruß

ao

Dieser Post wurde am 08.11.2004 um 23:32 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.11.2004, 07:57 Uhr
virtual
Sexiest Bit alive
(Operator)


@ao
Ja. Man hat diesen Fehler in C99 ja auch teilweise behoben. Als ich Post 007 schrieb hatte ich mehr die Möglichkeit vor Augen, daß jemand, der math.h normalerweise includieren würde, ebensogut

C++:
extern double sqrt(double);


schreiben könnte, wenn es nur um sqrt geht...

Aber natürlich hast Du Recht: man sollte die Includes schon benutzen
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: