Wozu brauche ich "stdlib.h" wenn es auch nur mit "stdio.h und time.h" klappt?



  • Hallo liebe Gemeinde,
    ich bin ein relativer Neuling im Programmieren..., dennoch möchte ich mit meinen 14 Jahren gerne C lernen, was ich auch schon angefangen habe. Also meine wirkliche Frage ist, ob mir jemand erklären kann warum ich wenn ich diesen Code habe:

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main() {
        int zufall;
        srand(time(NULL));
        zufall = rand()%100+1;
        printf("Zahl = %d", zufall);
        return 0;
    }
    

    Warum funktioniert diese Zufallszahlengenerierung auch ohne die stdlib.h, denn als ich testlicherweise sie auskommentiert habe ging es auch nur mit time.h und der Standard Input und Output (stdio.h)...
    Warum ist das so? - Mir wurde gesagt die stdlib.h sei wichtig, denn sonst würde es nicht laufen. Habe mir aber das Gegenteil bewießen.

    Liebe Grüße
    Jackmp



  • Jackmp schrieb:

    Hallo liebe Gemeinde,
    ich bin ein relativer Neuling im Programmieren..., dennoch möchte ich mit meinen 14 Jahren gerne C lernen, was ich auch schon angefangen habe. Also meine wirkliche Frage ist, ob mir jemand erklären kann warum ich wenn ich diesen Code habe:

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main() {
        int zufall;
        srand(time(NULL));
        zufall = rand()%100+1;
        printf("Zahl = %d", zufall);
        return 0;
    }
    

    Warum funktioniert diese Zufallszahlengenerierung auch ohne die stdlib.h, denn als ich testlicherweise sie auskommentiert habe ging es auch nur mit time.h und der Standard Input und Output (stdio.h)...
    Warum ist das so? - Mir wurde gesagt die stdlib.h sei wichtig, denn sonst würde es nicht laufen. Habe mir aber das Gegenteil bewießen.

    Liebe Grüße
    Jackmp

    Es ist üblich, daß ein Standard-Header für eigene Zwecke auch mal einen anderen Standard-Header selber inkludiert. Das DARF er. Aber das muss er nicht.
    Bei Dir gehts zufällig so. Glück gehabt.

    Aber der Standard garantier eben nur, daß rand() klappt, nachdem die <stdlib.h> von Dir selber inkludiert wurde. Kann sein, daß mit der nächsten Compilerversion Dein Programm nicht mehr compiliert, wenn Du es unterläßt.

    edit: Ich schaue immer da http://www.cplusplus.com/reference/cstdlib/rand/ , was ich inkludieren muss. Hier die <cstdlib>, was in C heißt <stdlib.h>



  • In den Headerdateien stehen "nur" die Deklarationen (Prototypen) für die Funktionen(, globalen Variablen) und die Definitionen von Makros und typedefs.

    Der Code von den Systemheadern ist in einer Bibliothek schon compiliert, die immer dazu gelinkt wird.
    Daher sind die Funktion auch vorhanden.

    Die Prototypen braucht der Compiler, damit er weiß wie er die Funktionen richtig aufrufen muss.
    Wenn er die nicht hat, versucht er aus dem ersten Aufruf den Prototyp zu erraten.
    Das ist gerade bei printf blöd, da sich die Typen (int, char*, double) der Paramter laufend ändern.

    NULL ist z.B. in stdlib.h und auch in stdio.h definiert.

    Der Compiler sollte dich aber warnen, wenn er auf Funktion trifft, die er nicht kennt.
    Wenn nicht, verändere den Warnlevel, damit du die Warnungen bekommst. (Wie und wo, ist vom Compiler/IDE abhängig)
    Behandle Warnungen wie Fehler und behebe deren Ursache.
    (Ok, es gibt Warnungen die man abstellen kann. Visual Studio meckert da gerne über unsichere Funktionen wie etwa scanf)



  • Okay, danke für eure Antworten!

    Liebe Grüße
    Jackmp


Log in to reply