Betrachten Sie den folgenden Code ein:Warum ist 'flüchtige' Parasiten in C++?
int main()
{
int i;
volatile int* p = &i;
int *v = p;
return 0;
}
dies ein Fehler gibt in g++
:
$ g++ -o volatile volatile.cpp
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’
Meine Absicht war, dass ich p
flüchtig machen wollen. Nachdem ich jedoch den Wert p
gelesen habe, ist es mir egal, ob der Zugriff auf v
flüchtig ist. Warum ist es erforderlich, dass v
für flüchtig erklärt wird?
Dies ist natürlich hypothetischer Code. In einer realen Situation können Sie sich vorstellen, dass auf einen Speicherort zeigt, aber extern geändert wird und ich möchte v
auf den Speicherort verweisen, der auf die Zeit v = p
wies, auch wenn später p
extern geändert wird. Daher ist flüchtig, aber v
ist nicht.
Nebenbei interessiert mich das Verhalten sowohl wenn dies als C und C++ betrachtet wird, aber in C erzeugt dies nur eine Warnung, kein Fehler.
Die Standards kennen den Unterschied zwischen einer Warnung und einem Fehler nicht. Es ist die Wahl des Compilers, wie eine Verletzung behandelt wird, solange mindestens eine Nachricht für das Programm gemeldet wird. –
vielleicht möchten Sie eine Kopie von p in v? – slf