¿Cuál es la diferencia entre static const
y const
? Por ejemplo:
static const int a=5;
const int i=5;
¿Hay alguna diferencia entre ellos? ¿Cuándo usarías uno sobre el otro?
¿Cuál es la diferencia entre static const
y const
? Por ejemplo:
static const int a=5;
const int i=5;
¿Hay alguna diferencia entre ellos? ¿Cuándo usarías uno sobre el otro?
Respuestas:
La diferencia es el vínculo.
// At file scope
static const int a=5; // internal linkage
const int i=5; // external linkage
Si el i
objeto no se usa fuera de la unidad de traducción donde está definido, debe declararlo con el static
especificador.
Esto permite al compilador realizar (potencialmente) optimizaciones adicionales e informa al lector que el objeto no se utiliza fuera de su unidad de traducción.
const int i = 5;
tiene enlace externo? En C ++ no ...
const
no tiene nada que ver con C ++ const
.
static
determina la visibilidad fuera de una función o la vida útil de una variable en el interior. Entonces no tiene nada que ver const
per se.
const
significa que no cambiará el valor después de que se haya inicializado.
static
dentro de una función significa que la variable existirá antes y después de que la función haya terminado.
static
fuera de una función significa que el alcance del símbolo marcado static
está limitado a ese archivo .cy no puede verse fuera de él.
Técnicamente (si desea buscar esto), static
es un especificador de almacenamiento y const
es un calificador de tipo.
const int i = 5;
i valor que puede modificar utilizando un puntero si i está definido y declarado localmente, si es estático const int a = 5; o const int i = 5; globalmente, no se puede modificar ya que se almacena en la memoria RO en el segmento de datos.
#include <stdio.h>
//const int a=10; /* can not modify */
int main(void) {
// your code goes here
//static const int const a=10; /* can not modify */
const int a=10;
int *const ptr=&a;
*ptr=18;
printf("The val a is %d",a);
return 0;
}
Depende de si estas definiciones están dentro de una función o no. La respuesta para el caso fuera de una función viene dada por ouah, arriba. Dentro de una función, el efecto es diferente, ilustrado por el siguiente ejemplo:
#include <stdlib.h>
void my_function() {
const int foo = rand(); // Perfectly OK!
static const int bar = rand(); // Compile time error.
}
Si desea que una variable local sea "realmente constante", debe definirla no solo "const" sino "const estática".
foo
la variable se reinicialice cada vez que my_function()
se llame, se asignará un valor aleatorio diferente. En el caso de bar
la variable inicializada solo una vez, la primera vez my_function()
se llama, lo que da como resultado que se asigne el mismo valor durante la vida útil del programa. De ahí la duración del almacenamiento estático.
bar
debido a que rand()
no es una constante de tiempo de compilación.