Betrachten Sie den folgenden C ++ - Code:
void* a = &a;
Warum beschwert sich der Compiler nicht über die Verwendung eines nicht deklarierten Bezeichners?
Was betrachtet der Compiler als Variable a
? Ist es ein Zeiger auf ein nichtiges Objekt oder ein Zeiger auf einen void*
Zeiger?
Antworten:
Der Umfang der Deklaration von Variablen in C ++ kann ziemlich überraschend sein:
Daher
&a
istvoid**
aber da jeder Zeigertyp implizit konvertierbar ist invoid*
...quelle
a = &userfulObject
?void *a = a;
dies UB wäre, wenn es lokal deklariert würde, andernfalls ist es im Namespace-Bereich in Ordnung.Es ist äquivalent zu
Daher
a
wurde erklärt. Soa
bekommt die Adresse vona
geschriebena
. Es ist also ein Zeiger auf einen leeren Zeiger. (Sie haben noch keine Objekte definiert.)quelle
a
selbst ist ein Objekt. (Nicht alle Objekte haben benutzerdefinierte Typen in C ++)In
void* a
,a
wird als Zeiger nicht zu einem deklariertenvoid
Typ , sondern „jeden“ Typ (Sonderfall). Eine Adresse (Position im Speicher) wirda
natürlich jeder anderen deklarierten Variablen zugewiesen .Danach wird der Ausdruck
&a
ausgewertet, um diea
gerade deklarierte Variable (auch , aber dies ist nicht relevant) zu initialisieren . Der Typ von&a
ist "Zeiger auf Zeiger auf einen beliebigen Typ". Dies ist ein Sonderfall von "Zeiger auf einen beliebigen Typ", der vollständig mit dem Typ von kompatibel ista
. Ergo keine Compiler-Nachricht.Folgerung: Nicht verwenden,
void*
wenn Sie eine starke Typprüfung wünschen. Alles kann dazu konvertiert werden. Genau das Gegenteil in umgekehrter Richtung, außer für sichvoid*
selbst (es wäre eine unnötige Ausnahme, dass ein Typ mit sich selbst nicht kompatibel wäre).Auch AFAIR das kommt wirklich von C.
quelle