Was bedeuten die gcc "implicit declaration..." warnings?



  • Mein Programm läuft nun. Jetzt bin ich an und dabei, den Sourcecode "aufzuräumen" und jede Warnmeldung des Compilers zu überprüfen, um sämtliche Nebenwirkungen ausschließen zu können. Der normale Compilevorgang gibt mir weder Warnungen noch errors aus, und das Proggi _scheint_ zu funktionieren. Übersetze ich allerdings mit -Wall, so bekomme ich einige Warnings:

    unused Vaiable
    

    -> behoben

    warning: implicit declaration of function 'schrift_setzen2'
    

    Was meint der Compiler damit? Der Funktionsaufruf hat folgenden Inhalt:
    gui.c:

    /* Schrift wird gesetzt */
            schrift_setzen2(ob_li_vorgabe_label[i]); // Vorgabe-Label
    

    Die Funktion selbst ist aber Ordnungsgemäß (in einer anderen Datei) deklariert:

    schrift.c

    void schrift_setzen2(GtkWidget *text_vom_widget)
    {
        /* Label */
    GtkStyle *new_style;
    
    new_style = gtk_style_copy (text_vom_widget->style);
    new_style->font_desc = pango_font_description_from_string("Helvetica 16");
    gtk_widget_set_style (text_vom_widget, new_style);
    }
    

    Der Inhalt hier ist zwar nicht mehr ANSI C, die Fehlermeldung jedoch schon. Ich hab den Code nur wegen dem besseren Verständnis beigefügt.

    Wie gesagt, es handelt sich um warnungen, die ich jedoch gern behoben haben würde, schon damit ich C endlich komplett begreifen kann. 🙂



  • schueler schrieb:

    warning: implicit declaration of function 'schrift_setzen2'
    

    Was meint der Compiler damit?

    die funktion wird verwendet, aber der compiler weiss nicht, wie sie eigentlich aussieht. manche compiler versuchen das anhand des aufrufs zu entziffern, andere gehen davon aus, dass die funktion einen int zurückgibt und einen int als argument erwartet. wenn hierbei was nicht passt, sind seltsame abstürze vorprogrammiert.
    🙂



  • Also ist es auf den Funktionstypen "void" zurückzuführen? Die Funktion hat aber keinen Rückgabewert. 😕



  • bzw "ob_li_vorgabe_label" hat den Datentyp GtkWidget, und das is das Ding, was ich übergebe. Deswegen muss die Funktion void sein...



  • schueler schrieb:

    Also ist es auf den Funktionstypen "void" zurückzuführen? Die Funktion hat aber keinen Rückgabewert. 😕

    leg dir doch eine header-datei an, die die prototypen der funktionen enthält. die #includeste dann in allen files, die die funktionen verwenden (und in den files, die die funktionen implementieren). dann weiss der compiler immer, wie eine funktion auszusehen hat, wenn er auf einen einen aufruf stösst.
    🙂



  • du musst einfach eine forward-declaration machen. Damit der Compiler den Funktionsprototypen kennt.

    void foo(); // forward declaration
    
    void bar() {
      foo();
    }
    
    void foo() {
     ...
    }
    


  • Vielen Dank! 🙂



  • rüdiger schrieb:

    du musst einfach eine forward-declaration machen. Damit der Compiler den Funktionsprototypen kennt.

    void foo(); // forward declaration
    
    void bar() {
      foo();
    }
    
    void foo() {
     ...
    }
    

    das hat den kleinen nachteil, falls er die funktion mal abändert aber die forward-declaration nicht anpasst, dass der compiler noch nicht mal warnt, aber das program trotzdem abraucht.
    🙂



  • daher am besten mit -Wall -W -pedantic -std=c99 kompilieren 🙂



  • Wieder etwas dazu gelernt. Vielen Dank.

    Eine Frage:
    ist der pedantic Ausdruck "schärfer" als -Wextra?



  • -pedantic "überwacht" mehr die Einhaltung des Sprachstandards. -Wextra (bzw. -W) mit -Wall gibt eher Warnungen über potentielle Fehler aus.

    Also am besten beides benutzen.



  • Na da sag ich mal dankeschön an alle! 😉


Anmelden zum Antworten