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.
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.
+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.
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 */intmain(void){
// your code goes here//static const int const a=10; /* can not modify */constint a=10;
int *const ptr=&a;
*ptr=18;
printf("The val a is %d",a);
return0;
}
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>voidmy_function(){
constint foo = rand(); // Perfectly OK!staticconstint bar = rand(); // Compile time error.
}
Si desea que una variable local sea "realmente constante", debe definirla no solo "const" sino "const estática".
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?
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 elstatic
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.
fuente
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 verconst
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 marcadostatic
está limitado a ese archivo .cy no puede verse fuera de él.Técnicamente (si desea buscar esto),
static
es un especificador de almacenamiento yconst
es un calificador de tipo.fuente
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; }
fuente
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".
fuente
foo
la variable se reinicialice cada vez quemy_function()
se llame, se asignará un valor aleatorio diferente. En el caso debar
la variable inicializada solo una vez, la primera vezmy_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 querand()
no es una constante de tiempo de compilación.