Estático vs global

Si tengo un archivo C como el siguiente, ¿cuál es la diferencia entre i y j ?

 #include  #include  static int i; int j; int main () { //Some implementation } 

i enlaces internos, por lo que no puede usar el nombre i en otros archivos fuente (unidades de traducción estrictamente) para referirse al mismo objeto.

j tiene un enlace externo, por lo que puede usar j para referirse a este objeto si lo declara extern en otra unidad de traducción.

i no es visible fuera del módulo; j es accesible a nivel mundial.

Es decir, otro módulo, que está vinculado a él, puede hacer

 extern int j; 

y luego podrá leer y escribir el valor en j . El mismo otro módulo no puede acceder a i , pero podría declarar su propia instancia, incluso una global, que no es visible para el primer módulo.

La diferencia es que i un enlace interno y j tiene un enlace externo. Esto significa que puede acceder a j desde otros archivos con los que se vincula, mientras que i solo está disponible en el archivo donde está declarado.

Tendré un enlace estático , es decir, la variable solo está accesible en el archivo actual.

j debe definirse como extern , es decir

 extern int j; 

en otro archivo de encabezado ( .h ), y luego tendrá un enlace externo , y se puede acceder a través de los archivos.

El scope de la variable / función estática está dentro del mismo archivo a pesar de que incluye el archivo como parte de un archivo fuente diferente.

El scope de la variable global está en todos los archivos en los que está incluido. Para incluir la variable en un archivo fuente diferente, usamos extern antes de la statement de la variable. No se asigna memoria de nuevo para la variable en este caso.

extern se usa para declarar una variable C sin definirla. extern palabra clave extern extiende la visibilidad de las variables C y C. Dado que las funciones son visibles a través del progtwig por defecto, el uso de extern no es necesario en la statement / definición de funciones. Su uso es redundante.