Verständnissfrage zu strtod aus stdlib.h

  • Moin moin

    Nachdem ich lange einen Fehler gesucht habe, warum strtod nicht so funktioniert wie ich erwartete, in einem anderen Programm aber tadellos, habe ich nach und nach die #include rausgenommen. Und siehe da, nehme ich stdlib.h raus dann erhalte ich fehlerhafte Ergebnisse.

    Mich wundert: Warum lässt sich dieses kleine Beispiel kompilieren, mit oder ohne stdlib.h?

    Woher holt sich der Kompiler nur die Funktion strtod ? :wallbash:

  • Code
    int i ;
    
    
    for( i = 0; i < 100000; i++ )
       printf( "Du sollst nicht ohne Header arbeiten !\n" ) ;

    Compilieren mit gcc -Wall, dann kommen Warnungen wegen solchen Konstruktionen !!

    Was passiert:

    * Compiler findet eine nicht definierte Funktion
    * Die anscheinend einen const char * und einen char ** bekommt

    Nur der Returnwert ist noch fragwuerdig, aber dafuer gibt es ja eine
    uralte Regel: was nicht definiert ist, ist ein int :fies:

    Der Compiler hat alles was er braucht und generiert Code ...

  • Das strtod() funktioniert ohne die Deklaration in stdlib.h nicht, weil der Compiler per default annimmt, dass die Funktion einen int zurückliefert.
    Wenn Du Deinen Code entsprechend abänderst:


    dann klappts auch mit dem strtod() ;) ...

    Ooops ... grad gesehen, Tell war schneller ;)
    cu,
    -ds-

  • Aachso ... :thumbs1:

    Werde ich mir merken, das mit dem -Wall
    Auch mit dem extern double strtod();

    Ich komme mehr aus der Pascal/Delphi-Welt.
    Daher wundert es mich, dass der gcc überhaupt etwas konstruiert, aus dem was eigentlich gar nicht da ist. (Oder doch? Nur woanders?)

    Schreibe ich eine Funktion in pascal, die z.B. einen Floatwert zurück gibt, binde diese aber nicht ein, dann wird da nichts zurückgegeben, geschweige denn kompiliert.
    Ausser natürlich, der Kompiler findet in unit_xyz eine Funktion die zufällig genauso lautet.

    Danke für die Tips/Erklärung!


  • ....
    Daher wundert es mich, dass der gcc überhaupt etwas konstruiert, aus dem was eigentlich gar nicht da ist.
    ...


    vielleicht noch was zum Verständnis:
    per #include eingebundene Dateien sind keine Libraries sondern sog. Headerfiles die nur Erklärungen für den Compiler - also Macros, Defintionen, Funktions-Prototypen ( wie auch das "extern double strtod()" eine ist ) usw. enthalten. Sie enthalten also keinen Programm- bzw. Funktions-Code.
    Falls doch, dann ist das - zumindest nach meinem Verständnis - unsauber.
    So gesehen ist erst mal gar nichts da ... nur die Aufrufe.
    Und da der Compiler mal davon ausgeht, dass Du schon weisst, was Du da tust, nimmt er einfach an, dass Deine Aufrufe schon in Ordnung sind und Funktionen, die er nicht kennt (weil Du den entsprechenden Header nicht mit #include eingebunden hast) nimmt er als int an - das hatten wir ja.
    Erst der Linkerlauf löst die Aufrufe auf. Und da der Funktionscode von strtod wohl in der libc steht, wird beim Binden die Funktion auch gefunden und der Aufruf aufgelöst, weil die libc immer dazugebunden wird.


    ....
    Schreibe ich eine Funktion in pascal, die z.B. einen Floatwert zurück gibt, binde diese aber nicht ein, ...


    Das ist in C nicht anders ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!