2010-02-16 13 views
48

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 
} 
+1

Lea las respuestas a esta pregunta: http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar

+0

[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) –

Respuesta

44

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.

+7

¿Hay alguna diferencia de rendimiento? – ma11hew28

+0

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

17

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.

+1

Es el declaración 'extern' necesaria? –

+1

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

+1

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

4

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.

3

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.

Cuestiones relacionadas