Si consideri il seguente codice:Perché il parassita 'volatile' è in C++?
int main()
{
int i;
volatile int* p = &i;
int *v = p;
return 0;
}
Questo dà un errore in g++
:
$ g++ -o volatile volatile.cpp
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’
La mia intenzione era che voglio fare p
volatile. Tuttavia, una volta letto il valore di p
, non mi interessa se l'accesso a v
è volatile. Perché è richiesto che v
sia dichiarato volatile?
Questo è ovviamente un codice ipotetico. In una situazione reale, è possibile immaginare che p
punti in una posizione di memoria, ma viene modificato esternamente e voglio v
in modo che punti al momento di v = p
, anche se successivamente p
viene modificato esternamente. Pertanto, p
è volatile, ma non lo è v
.
A proposito, sono interessato al comportamento sia quando questo è considerato C e C++, ma in C questo genera solo un avviso, non un errore.
Gli standard non conoscono la differenza tra un avviso e un errore. È la scelta del compilatore come gestire una violazione, fintanto che riporta almeno un messaggio per il programma. –
forse vuoi una copia di p in v? – slf