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.