static_cast<void>(argc); - Bedeutung?



  • Bin über diese Zeile gestolpert:

    static_cast<void>(argc);

    ich werde aber einfach nicht schlau daraus, was static_cast<void>(argc) bewirkt?



  • Tim890 schrieb:

    ich werde aber einfach nicht schlau daraus, was static_cast<void>(argc) bewirkt?

    Nichts.

    Wahrscheinlich soll eine Compilerwarnung wegen unbenutzter Variablen verhindert werden. Was die Frage aufwirft, warum der Parameter überhaupt einen Namen hat.



  • Dieses Statement macht dem Compiler klar, dass die Variable/Parameter argc "gebraucht" wird - auch wenn sie nicht wirklich im Code verwendet wird. Das macht man um Warnungen über ungebrauchte Variablen/Parameter zu verhindern. Unter Visual Studio werden solche Warnungen ab Level 4 angezeigt.

    Auch zu sehen ist oft:

    (void)argc;
    

    Oder unter Visual Studio:

    argc;
    

    Bei Parametern kann man diese Art von Warnungen aber auch wie folgt verhindern:

    void f(int i) {}     // -> Warnung, dass i nicht verwendet wird
    void g(int /*i*/) {} // -> Variante 1 um die Warnung zu verhindern
    void g(int) {}       // -> Variante 2 um die Warnung zu verhindern
    


  • Da es sich hier wohl um main() handelt und man mit argv nichts Sinnvolles anfangen kann, ohne argc zu kennen, wäre das Naheliegendste die alternative Signatur:

    int main()
    


  • Nexus schrieb:

    Da es sich hier wohl um main() handelt und man mit argv nichts Sinnvolles anfangen kann, ohne argc zu kennen

    Klar kann man das. Argv ist durch einen Nullzeiger terminiert.



  • Alternativ muss man den Parametern keinen Namen geben, wenn man sie nicht benutzt. Das sollte dann auch keine Warnung mehr geben bzgl unbenutzter Parameter. Zumindest ist das beim GCC so.



  • danke für die vielen Antworten.
    Also hat es nichts damit zu tun, dass, wenn ich der Kommandozeile Argumente mitgebe, ich mit diesem Befehl und dem Casten auf void ermögliche, dass alle eingegebenen Werte akzeptiert werden? Egal ob String, Zahl oder sonst was..



  • Genau, damit hat's nichts überhaupt nichts zu tun. void ist nicht any. Es gibt nur Zeiger, die auf alles zeigen können, void*. Das geht aber auch wirklich nur bei Zeigern.


Anmelden zum Antworten