"..."-Keyword



  • va_list argptr;
    char msg[256];

    va_start( argptr, fmt );
    vsprintf( msg, fmt, argptr );
    va_end( argptr );



  • Hallo,
    IMHO gibt es in Standard-C++ keine Möglichkeit auf die Argumente einer solchen Funktion zuzugreifen, wenn nicht mindestens ein Parameter spezifiziert wurde.



  • Dieser erste Parameter wäre im Beispiel von Simon der Formatstringzeiger fmt.
    Notfalls einfach einen dummy-Zeiger nehmen, va_start braucht halt ein Argument.



  • OK 🙂 Ja, das kannte ich schon von printf und co.. Allerdings frage ich mich, was es denn für einen Sinn macht, wenn C++ solche Funktionen erlaubt, die nur einen "..."-Parameter haben, während C das nicht tut. Das muss doch irgendeinen Grund haben.
    Ist es nicht so, dass irgendein Prozessorregister immer auf den ersten Parameter zeigt? Vielleicht ginge es damit.



  • NULL



  • Original erstellt von TomasRiker:
    Allerdings frage ich mich, was es denn für einen Sinn macht, wenn C++ solche Funktionen erlaubt, die nur einen "..."-Parameter haben, während C das nicht tut. Das muss doch irgendeinen Grund haben.

    Vor C99 musste man auch JEDE lokale Variable am Anfang der Funktion deklarieren, während man in C++ schon immer Schleifen in der Art "for(int i = 0; ..." machen konnte. Ist halt eine Frage, wie locker man die Sprache erlaubt.

    **
    Ist es nicht so, dass irgendein Prozessorregister immer auf den ersten Parameter zeigt? Vielleicht ginge es damit.**

    Auf Intelprozessoren ja. Auf Sparc-Prozessoren shcon nicht mehr so genau. Aber im Prinzip könnte man für jede Architektur soetwas basteln, ja.



  • man könnte das ganze doch in "richtigem" c++ machen, indem man einen vector/array von zeigern auf objekte übergibt. mithilfe von typeid kann man dann wieder zurückschliessen.



  • Original erstellt von TomasRiker:
    Allerdings frage ich mich, was es denn für einen Sinn macht, wenn C++ solche Funktionen erlaubt, die nur einen "..."-Parameter haben, während C das nicht tut. Das muss doch irgendeinen Grund haben.

    C erlaubt das genauso.

    Die Deklaration

    void foo();
    

    stellt in C einen Prototyp einer Funktion mit variabler Argumentliste dar. In C++ würde man das mit (...) schreiben müssen, da sonst eine Funktion ohne Argumente angenommen würde. Will man in C eine Funktion deklarieren, die keine Argumente annimmt, dann schreibt man:

    void foo(void);
    


  • Korbinian: glaube nicht, dass das "richtiges" C++ ist, klingt eher nach einem wilden Hack (wenn es überhaupt funktioniert, ich hab da insbesondere bei Zeigern auf POD meine Zweifel)



  • wieso sollte typeid bei POD nicht funktionieren? man muss nur aufpassen, dass man den evtl. neu allokierten speicher auch wiede rfreigibt.
    werd heut abend mal sowas basteln, mal schaun obs funkt 🙂


Anmelden zum Antworten