Funktionen mit Default-Argumenten als Deklaration



  • hi,

    ich möchte hier nur sicherstellen ob ich so alles richtig verstanden habe und dass man an diese Regeln halten sollte:

    es gibt einmal diese Funktion mit Default-Wert

    void dummy(int i = 0) {};
    

    diese funktion möchte ich jetzt in headerdatei, also deklariere ich sie dort

    void dummy(int i = 0);
    

    und in cpp-datei

    void dummy(int i) {};
    

    das funktionierte alles

    d.h. die default-werte dürfen nur in der deklaration stehen ?
    ich habe in cpp-datei auch nochmal diese default-werte geschrieben. praktisch doppelt. dann kam ein fehler. warum eigentlich ?

    dann habe ich ein weiteres experiment gemacht:
    default-wert nur in cpp. in der deklaration nur void dummy(int i);
    dann geht es zwar auch aber dann muss in main() das argument angegeben werden.
    macht also default-wert in cpp keinen sinn oder?

    die regel heisst also letzten endes: default-werte nur in der deklaration schreiben!
    so richtig verstanden alles?



  • Du darfst für jeden Parameter nur einen Default-Wert angeben (und selbst wenn die angegebenen Werte textuell identisch sind, gibt's Probleme mit einer mehrfachen Definition (?)). Wo du das machst, ist theoretisch egal.

    Aber: Der Compiler kann nur die Deklarationen nutzen, die er in der aktuellen Übersetzungseinheit gesehen hat - wenn der Default schon im Header stand, kennt er ihn und kann ihn nutzen; wenn der Default nur im Sourcefile steht, kennt er ihn in einer anderen Übersetzungseinheit nicht. (Sinn könnte letzteres durchaus machen - aber atm fällt mir da kein Anwendungsbeispiel ein)



  • okay danke

    noch ein paar Fragen:

    ich habe im Header eine Deklaration:

    SDL_Surface *load_image( std::string const& filename );

    allerdings funktioniert die erst dann, wenn ich im Header string inkludiert habe.

    #include <string>
    

    bei SDL_Surface ist das nicht notwendig. Es funktioniert auch ohne

    #include "SDL/SDL.h"
    #include "SDL/SDL_image.h"
    

    Die habe ich im Sourcefile geschrieben. Das gleiche wollte ich mit string machen, aber es geht nicht. Warum?

    Sollten diese Includes nicht normalerweise nur im Sourcefile stehen, um Kollisionen zu vermeiden?
    Oder gilte das eher nur für die using namespace? Ich kann mich da recht nicht mehr erinnern...

    Warum braucht man bei SDL überhaupt keine using namespaces? Weil das so festgelegt ist?



  • Die Header (gerade der Standardbibliothek) sind schon so aufgebaut, daß sie nicht mit sich selbst kollidieren können (Stichwort "Include Guard"). Von der Seite brauchst du also keine Probleme erwarten.
    Für SDL_Surface und ähnliches reichen eventuell Forward-Deklarationen aus, wenn du dir den Header sparen willst, für std::string gibt es keine portable Forward-Deklaration.

    "using namespace std;" ist da kritischer, weil es den gesamten Namensraum aus den Angeln hebt - und damit in fremden Programmen möglicherweise Kollisionen auslöst zwischen Namen, die nie auch nur miteinander verwendet wurden.



  • Dann krieg ich wohl langsam alles im Griff. Mein Code dürfte jetzt sauber sein und ich sehe Klarheit.

    danke



  • Dass SDL_Surface* keinen Fehler gibt liegt einfach daran, dass es der Rückgabetyp ist, der spielt zu dem Zeitpunkt noch keine Rolle.



  • Nichtsdestotrotz muß es für 'SDL_Surface' eine Vorwärtsreferenz geben...


Log in to reply