Si tengo un archivo C como el siguiente, ¿cuál es la diferencia entre i
y j
?Estático vs global
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main()
{
//Some implementation
}
Si tengo un archivo C como el siguiente, ¿cuál es la diferencia entre i
y j
?Estático vs global
#include <stdio.h>
#include <stdlib.h>
static int i;
int j;
int main()
{
//Some implementation
}
i
tiene un enlace interno por lo que no puede usar el nombre i
en otros archivos fuente (unidades de traducción estrictas) para hacer referencia al mismo objeto.
j
tiene vinculación externa para que pueda utilizar j
para referirse a este objeto si se declara que extern
en otra unidad de traducción.
¿Hay alguna diferencia de rendimiento? – ma11hew28
no debería haber una diferencia de tiempo de ejecución si está haciendo lo mismo, ya que el compilador podría generar el mismo código. Sin embargo, la compilación podría ser un poco más larga con una global, ya que tiene un alcance más amplio. –
i
no está visible fuera del módulo; j
es accesible a nivel mundial.
Es decir, otro módulo, que está vinculada a la misma, puede hacer
extern int j;
y luego ser capaz de leer y escribir el valor en j
. El mismo otro módulo no puede acceder al i
, pero podría declarar su propia instancia, incluso una global, que no es visible para el primer módulo.
Es el declaración 'extern' necesaria? –
Depende de la implementación. Se garantiza que el uso de 'extern' no causará problemas, siempre que un módulo tenga el símbolo como no-'extern' y público (que lo asigna). Las primeras implementaciones de Unix fusionaron símbolos con el mismo nombre, muy parecido a un Fortran común, por lo que 'extern' no era obligatorio. – wallyk
Tenga en cuenta que "No visible" no significa que esté fuera del alcance. Eso significa que si declarara una i en una unidad de compilación diferente y eliminara la static i de su archivo .c, la global sería visible para su archivo .c. Por el contrario, si el global i estuviera fuera del alcance, no importaría si tuviera un static i declarado en su archivo .c. El global nunca sería visible. La estática que toma precedencia sobre una global i que se define en otra unidad de compilación se denomina 'sombreado'. También ocurre con locales de función y no es solo cosa de C++/c. – Jupiter
La diferencia es que i
tiene un enlace interno y j
tiene un enlace externo. Esto significa que puede acceder al j
desde otros archivos con los que se vincula, mientras que i
solo está disponible en el archivo donde se declara.
i
tendrá enlace estático, es decir, la variable solo está disponible en el archivo actual.
j
deberían definirse como extern
, es decir
extern int j;
en otro archivo de cabecera (.h
), y entonces tendrá enlazado externo, y se puede acceder a través de los archivos.
Lea las respuestas a esta pregunta: http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar
[Diferencia entre variables estáticas, automáticas, globales y locales en el contexto de c y C++] (https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) –