2008-10-24 15 views
5

En C y C++, ¿qué hacen las siguientes declaraciones?¿Cuál es la diferencia entre estas declaraciones en C?

const int * i; 
int * const i; 
const volatile int ip; 
const int *i; 

¿Alguna de las declaraciones anteriores es incorrecta?

Si no, ¿cuál es el significado y las diferencias entre ellos?

¿Cuáles son los usos útiles de las declaraciones anteriores (es decir, en qué situación debemos usarlas en C/C++/C incrustado)?

+0

Si va a editar por gramática y ortografía, ¿por qué no escribe "Si" con una 'I' y no con un '!'? – Eclipse

Respuesta

34

const int * i;

i es un puntero a entero constante. i se puede cambiar para que apunte a un valor diferente, pero el valor apuntado por i no se puede cambiar.

int * const i;

i es un puntero constante a un número entero no constante. El valor apuntado por i se puede cambiar, pero i no se puede cambiar para apuntar a un valor diferente.

const volatile int ip;

Ésta es un poco complicado. El hecho de que ip es const significa que el compilador no le permitirá cambiar el valor de ip. Sin embargo, aún podría modificarse en teoría, p. tomando su dirección y usando el operador const_cast. Esto es muy peligroso y no es una buena idea, pero está permitido. El calificador volatile indica que en cualquier momento que se acceda a ip, siempre se debe volver a cargar desde la memoria, es decir, NO se debe almacenar en caché en un registro. Esto evita que el compilador realice ciertas optimizaciones. Desea utilizar el calificador volatile cuando tenga una variable que pueda ser modificada por otro hilo, o si está utilizando E/S mapeadas en memoria, u otras situaciones similares que podrían causar un comportamiento que el compilador podría no estar esperando. Usar const y volatile en la misma variable es bastante inusual (pero legal); por lo general, verá uno pero no el otro.

const int *i;

Esto es lo mismo que la primera declaración.

+0

¿Estás seguro de que la volatilidad garantiza que el valor de solo lectura refleje los cambios realizados en otra secuencia? ¿En qué implementaciones? ¿Y las arquitecturas multi-core con cachés no coherentes? –

+1

Si una variable ** está declarada ** 'const' (como' ip' está aquí), entonces es un comportamiento indefinido eliminar el 'const' con' const_cast' para modificar el valor. Además, volátil no garantiza que los cambios sean visibles para otro subproceso. Compiladores particulares pueden hacer esa garantía. –

+0

Anthony tiene toda la razón. volátil no hace que su variable sea consciente de los hilos. también, descartar const de una variable declarada const es comportamiento indefinido. –

4

Lea las declaraciones de variables en C/C++ de derecha a izquierda, por así decirlo.

const int *i; // pointer to a constant int (the integer value doesn't change) 

int *const i; // constant pointer to an int (what i points to doesn't change) 

const volatile int ip; // a constant integer whose value will never be cached by the system 

Cada uno tiene sus propios fines. Cualquier libro de texto en C++ o recurso medio decente tendrá explicaciones de cada uno.

Cuestiones relacionadas