2010-03-19 11 views
22

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.

+2

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. –

+2

¿quizás quieres una copia de p en v? – slf

Respuesta

36

Si se refiere a que el puntero debe ser volátil, en lugar del objeto al que apunta, entonces declararemos como

int* volatile p; 
+7

Esta es su respuesta, Steve. Me gustaría agregar esta recomendación: * Siempre escriba el calificador const/volátil ** después de ** lo que quería calificar. * Es la única manera de escribir calificadores * consistentemente *, porque puede escribir tanto 'volatile int' y 'int volátil' cuando quiere un entero volátil, pero solo' int * volátil' le dará un * puntero volátil *. – DevSolar

+0

¡Gracias! Ni siquiera pensé en esto. Completamente lógico, gracias. – Steve

+1

La forma más fácil de leer las declaraciones (tanto para const como para la colocación volátil) es simplemente leerlas al revés. Por lo tanto, "int * volátil" es un "puntero volátil a un int". – Adisak

14

En C++ la palabra clave volatile se aplica el mismo tipo de restricción en lo que puede hacer tan const hace. El Estándar se refiere a esto como 'cv-qualification' como en 'const/volátil qualification. Las constras solo pueden usarse por constelaciones, y de la misma manera los volátiles solo pueden ser utilizados por volátiles.

Como un lado, esto puede ayudarlo a escribir el código multiproceso. No en virtud de emplear alguna magia de compilación que hace que tu variable sea repentinamente atómica o algo así, sino forzándote a actuar solo en datos volátiles de forma volátil. Vea esto Alexandrescu article para más información.

+0

También vale la pena leer: http://www.mikeash.com/pyblog/friday-qa-2009-07-10-type-specifiers-in-c-part-3.html (también conocido como OSMemoryBarrier)) – slf

Cuestiones relacionadas