Sombreado de identificadores globales y locales estáticos

El siguiente progtwig estaba en una hoja de ejercicios de práctica dada en clase. Se nos pide que proporcionemos su salida, pero por lo que entiendo sobre la vinculación, file2.c no debe tener dos instancias del identificador estático b, pero el progtwig se comstack con una advertencia y funciona bien. Mi pregunta es, ¿por qué se permite esto? ¿Pensé que el punto de enlace estático era poder acceder a un identificador en cualquier parte de ese archivo?

ACLARACIÓN: La pregunta es acerca de file2.c: hay dos declaraciones “static int b”. ¿Por qué se permite eso?

/ * archivo1.c * /

#include  extern int a; static int b; void f(int); void g(void); int main() { a = 10; b = 20; f(a); f(b); g(); printf("main: %d %d\n", a, b); return 0; } 

/ * archivo2.c * /

 include  int a; static int b; void f(int c) { static int b = 5; a += b; b += c; printf("f: %d %d\n", a , b ) ; } void g(void) { a += 5; b = 10; printf("g: %d %d\n", a , b); } 

Gracias de antemano por cualquier ayuda (esta es la primera vez que publico, así que me disculpo si hay errores de formato).

El comstackdor crea una instancia diferente para cada variable estática global, incluso cuando tiene varias variables con nombres idénticos.

De hecho, el comstackdor (o posiblemente, el preprocesador) cambia implícitamente el nombre de cada variable, de acuerdo con el nombre del archivo fuente que lo declara.

Puede probarlo a sí mismo declarando una variable estática global en un archivo de encabezado y luego incluir este archivo de encabezado en varios archivos de origen diferentes. Intente establecerlo en un valor diferente en cada archivo de origen, y verá que esta variable conserva su valor diferente en cada archivo de origen.

Si desea tener la misma instancia de una variable global accesible en varios archivos de origen, debe abstenerse de declararla static :

  • Si lo declara en un archivo de encabezado, use extern como prefijo e incluya el archivo de encabezado en cada archivo fuente que haga uso de esta variable.
  • Si lo declara en un archivo de origen, entonces deberá declararlo como extern en cualquier otro archivo de origen que haga uso de esta variable.

La dirección de una variable global externa se determina solo durante el enlace . Esto contrasta con los siguientes casos, en los que la dirección de la variable se determina durante la comstackción :

  • Una variable local
  • Una variable local estática
  • Una variable global estática
  • Una variable global no externa

Creo que el término static linkage refiere al enlace de objetos comstackdos (o bibliotecas) en la imagen ejecutable durante el proceso de comstackción , en lugar de dynamic linkage que se refiere al enlace del código comstackdo (también conocido como DLL) en la imagen ejecutable sólo durante el tiempo de ejecución .


ACTUALIZAR:

Después de leer su aclaración, entiendo que el único problema es con una variable local y una variable global con el mismo nombre (el atributo static no hace ninguna diferencia con respecto a este problema).

Dentro de una función, una variable local siempre es “preferida por el comstackdor” sobre una variable global con el mismo nombre. En otras palabras, en la función f , todas las operaciones en la variable b se aplican en la variable local y no en la variable global.