Considere el siguiente código:¿Por qué es 'parasitario' volátil en C++?
int main()
{
int i;
volatile int* p = &i;
int *v = p;
return 0;
}
Esto da un error en g++
:
$ g++ -o volatile volatile.cpp
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’
Mi intención era que yo quiero hacer p
volátil. Sin embargo, una vez que he leído el valor de p
, no me importa si el acceso a v
es volátil. ¿Por qué se requiere que v
se declare volátil?
Este es un código hipotético, por supuesto. En una situación real, podría imaginarse que p
apunta a una ubicación de memoria, pero se modifica externamente y quiero que v
señale la ubicación que p
señaló en el momento de , aunque más tarde se modifique externamente. Por lo tanto, p
es volátil, pero v
no lo es.
Por cierto, me interesa el comportamiento tanto cuando se considera C como C++, pero en C esto solo genera una advertencia, no un error.
Las normas no conocen la diferencia entre una advertencia y un error. Es la elección del compilador cómo manejar una violación, siempre que reporte al menos un mensaje para el programa. –
¿quizás quieres una copia de p en v? – slf