static-Deklaration von Funktionen



  • Beim Übersetzen eines älteren Quelltextes mit einem neuen GNU-C-Compiler meckert der Compiler über Folgendes:

    void function_x()
    {
        int i;
        static int function_y();
    
        ...
        i = function_y();
        ...
        return;
    }
    
    static int function_y()
    {
        ...
        return(0);
    }
    

    Der Compiler beschwert sich über die statische Deklaration der Funktion function_y() innerhalb der Funktion function_x(). (Auf älteren GCC-Versionen lief das ohne Errors durch.)

    Frage: Welche Auswirkung hat das "static" überhaupt bei der Funktionsdeklaration/-definition?
    Was passiert, wenn ich das "static" einfach ersatzlos entferne?

    Martin



  • Static in diesem Fall bedeutet, dass die Funktion nur in der Compilierungseinheit sichtbar ist.

    So ist das aber sowieso quatsch. Wenn, dann wird die Funktion auch fürs ganze c-File Vorwärtsdeklariert:

    static int function_y();
    
    void function_x()
    {
        int i;
    
        ...
        i = function_y();
        ...
        return;
    }
    
    static int function_y()
    {
        ...
        return(0);
    }
    

    EDIT:
    Wenn Du "static" entfernst (dann aber an beiden Stellen!), bedeutet das, dass der Linker beim zusammensetzen der Objekte zu einer ausführbaren Datei die Funktion "function_y" mit in die Suche nach Funktionen einbezieht, was Konflikte bedeutet falls es woanders noch eine "function_y" gibt. Mit static tut er das nicht (u.U. weiss der Linker dann sogar schon nicht mehr wie die Funktion mal hiess).



  • Mal zur Frage, warum denn der neue GCC das nicht mag ...
    Könnte es daran liegen, dass der alte GCC keine nested functions unterstützt, der neue aber schon?
    Im Fall des neueren GCC würde das static dann keinen Sinn machen bzw. es wäre einfach nur Quatsch, eine nested function durch static modulweit bekannt zu geben, oder?
    Ich denk mal der alte hat das nur einfach mal so hingenommen. Darüber entzückt war der wahrscheinlich auch ned ...



  • Danke für die Infos!

    @LordJaxom:
    Diese Variante habe ich mal ausprobiert: Jetzt lässt sich der alte Quelltext wieder kompilieren. (Zwar funktioniert das Programm immer noch nicht richtig, aber das liegt wahrscheinlich an anderen Dingen.)


Log in to reply