¿Cuál es la diferencia entre la constante estática y la constante?

81

¿Cuál es la diferencia entre static consty 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?

Lior
fuente
5
Votó para reabrir. El "duplicado" hace una pregunta completamente diferente, específica del uso de la memoria. Esta pregunta plantea una pregunta más general sobre la diferencia.
rmaddy

Respuestas:

56

La diferencia es el vínculo.

// At file scope
static const int a=5;  // internal linkage
const int i=5;         // external linkage

Si el iobjeto no se usa fuera de la unidad de traducción donde está definido, debe declararlo con el staticespecificador.

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.

ouah
fuente
8
+1 Sería genial si también pudiera agregar lo que significa si esas declaraciones están dentro de una función.
Pretoriano
¿Estás seguro de que const int i = 5;tiene enlace externo? En C ++ no ...
Kerrek SB
4
@KerrekSB en el alcance del archivo, sí. (C99, 6.2.2p5) "Si la declaración de un identificador para un objeto tiene alcance de archivo y ningún especificador de clase de almacenamiento, su vínculo es externo".
ouah
13
@KerrekSB: C y C ++ no son el mismo idioma. En particular, C constno tiene nada que ver con C ++ const.
R .. GitHub DEJA DE AYUDAR A ICE
¿Realmente optimizan los compiladores basándose en estática? Parece que no es seguro suponer que un objeto estático no se usa fuera de su unidad de traducción, ya que aún puede pasar una función no estática o señalarlo con un puntero global no estático.
nw.
99

staticdetermina la visibilidad fuera de una función o la vida útil de una variable en el interior. Entonces no tiene nada que ver constper 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.

staticfuera de una función significa que el alcance del símbolo marcado staticestá limitado a ese archivo .cy no puede verse fuera de él.

Técnicamente (si desea buscar esto), statices un especificador de almacenamiento y constes un calificador de tipo.

Joe
fuente
0

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;
} 
A Bin
fuente
-1

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

nibot
fuente
Se compila perfectamente para mí ... Pero sé que es estúpido tener una variable constante estática en este caso.
DrumM
1
@DrumM no es estúpido. En el caso de que foola variable se reinicialice cada vez que my_function()se llame, se asignará un valor aleatorio diferente. En el caso de barla 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.
jb
1
En realidad, en una reflexión más profunda, depende de si estamos usando C o C ++. La pregunta se etiqueta C, en cuyo caso obtenemos un error de compilación para la asignación de bardebido a que rand()no es una constante de tiempo de compilación.
jb
1
@nibot ¿puede aclarar lo que quiere decir con "el efecto es diferente" y "realmente constante" con referencia a la especificación de almacenamiento y la calificación de tipo?
jb