was ist eigentlich ((void)0)



  • #define UNINIT(p) ((void)0)
    
    int main()
    {
       int r;
       r = UNINIT;
    
       return 0;
    }
    

    dann ist r nicht initializiert?
    was ist eigentlich ((void)0), wieso macht man so was statt einfach 0 zu schreiben



  • netrobot schrieb:

    was ist eigentlich ((void)0), wieso macht man so was statt einfach 0 zu schreiben

    meist du nicht vielleicht eher: (void*****)0 ?
    das sieht man manchmal als 'null pointer', wird benutzt um einen pointer als ungültig zu markieren. aber wozu das gut ist weiss ich auch nicht. eine einfache 0 reicht doch immer.
    🙂



  • in diesem Fall es ist kein Pointer

    #define UNINIT(p) ((void)0)
    

    es ist schon richtig
    aber in main.c hab ich falsch geschrieben
    es soll :

    #define UNINIT(p) ((void)0)
    
    int main()
    {
       int r;
       UNINIT(r); 
    
       return 0;
    }
    

    sein.
    original war :

    #ifdef _DEBUG
    #define UNINIT(p) ((p) = rand(256))
    #else
    #define UNINIT(p) ((void)0)
    #endif
    


  • Ist doch klar: man will hier uninitialisierten Variablen zufällige Initialisierungen verpassen um sicherzustellen, dass nirgends im Programm auf Vorinitialsierungen aus Debug-Builds verwendet werden, sondern immer korrekt initialisiert wird.
    Eigentlich keine schlechte Idee



  • Wenn DEBUG nicht gesetzt ist, will man auf diese Art und Weise jegliche Compilerwarnung unterdrücken, die ansonsten entstehen könnte:

    /* Sei fragliche Zeile folgende */
    UNINIT(p);
    
    /* Dann könnte bei höchster Warnstufe folgendes passieren */
    
    #define UNINIT(p) 
    /* Warnung: Extra ';' am Ende der Zeile */
    
    #define UNINIT(p) (0)
    /* Warnung: Statement hat keine Auswirkung */
    

    Natürlich würde es noch einige andere Methoden geben, um hier ein leeres Statement zu erzeugen.



  • verstehe, mit anderem wort wenn ich das als release compiliere, soll ich warning bekommen, r ist nicht initializiert.



  • ;fricky schrieb:

    aber wozu das gut ist weiss ich auch nicht. eine einfache 0 reicht doch immer.

    Damit verhindert man Sachen wie:

    int a = NULL;
    


  • Nexus schrieb:

    ;fricky schrieb:

    aber wozu das gut ist weiss ich auch nicht. eine einfache 0 reicht doch immer.

    Damit verhindert man Sachen wie:

    int a = NULL;
    

    würde es NULL gernicht erst geben, hätte man's auch verhindert.
    🙂



  • Nexus schrieb:

    ;fricky schrieb:

    aber wozu das gut ist weiss ich auch nicht. eine einfache 0 reicht doch immer.

    Damit verhindert man Sachen wie:

    int a = NULL;
    

    Hältst du ein 'echtes' NULL denn für notwendig bzw. sinnvoll? Ich weise auch immer einfach 0 zu und habe erwartungsgemäß wenig Probleme damit. 😉



  • ;fricky schrieb:

    meist du nicht vielleicht eher: (void*****)0 ?
    das sieht man manchmal als 'null pointer', wird benutzt um einen pointer als ungültig zu markieren. aber wozu das gut ist weiss ich auch nicht. eine einfache 0 reicht doch immer.
    🙂

    kann es nicht sein das auf manchen Plattformen gilt

    ((void*)0)!= 0
    

    😕



  • track__ schrieb:

    kann es nicht sein das auf manchen Plattformen gilt

    ((void*)0)!= 0
    

    😕

    Das glaube ich eher nicht, das wäre als würdest du sagen (char)3!=3 oder so. Wenn du 0x00000000 in einen anderen Integer-Typ castest, bleibt das trotzdem Null. (NULL!=0 könnte ich mir dann schon eher vorstellen).



  • Doch kann es, weil diese spezielle Konstante im Standard als Nullzeiger definiert wurde und ein beliebiges Bit-Muster darstellen kann, wenn die eingesetzte Plattform über eine solches zur Darstellung von Null-Zeigern verfügt.

    In der Realität sieht die Sache heute natürlich anders aus, aber das ist so wie heute ein Byte 8 Bit hat.



  • dazu gabs hier schon lange diskussionen, wenn ich mich recht erinnerer setzt bei

    void *p;
    int i;
    p = 0;
    i = 0;
    

    die zuweisung 'p=0' die systemspezifische nullpointer-konstante ein, während bei 'i=0' eine echte 0 benutzt wird, also alle bits 0 und so.
    🙂


Anmelden zum Antworten