En la programación en C, ¿se puede acceder a una variable estática de un archivo desde otro archivo?

Respuesta corta :
Solo si la variable estática se define en un archivo de encabezado, que se incluye en el archivo .c desde el que está intentando acceder a la variable. No a través de archivos .c y de otra manera. (Suponiendo que se refiera a declaraciones y definiciones globales)

Explicación:
Primero, comprendamos la vinculación. Cuando se compila un programa C de varios archivos, sucede lo siguiente.
Paso 1: para cada archivo .c: todos los encabezados de este archivo .c se incluyen de forma recursiva hasta que se crea un solo archivo con toda la fuente. Este archivo (llamado Unidad de traducción) se compila para generar un archivo .o (objeto) con el mismo nombre que el archivo .c.
Nota: Esto explica por qué es posible acceder a las variables estáticas definidas en cualquiera de los archivos de encabezado incluidos en su archivo .c.
Paso 2 – Vinculación: el proceso de vinculación conecta símbolos (nombres de variables, nombres de funciones declarados / definidos apropiadamente) a través de las unidades de traducción (es decir, a través de sus archivos .c) para generar el ejecutable final.

Ahora, la palabra clave static obliga a que el enlace sea interno. En otras palabras, estática asegura que el símbolo sea invisible fuera de su unidad de traducción actual. Esto significa que este símbolo no se puede vincular con ningún símbolo en otras unidades de traducción, lo que implica que es imposible acceder o modificar una variable estática declarada globalmente en un archivo .c desde otro.

Directamente no puedes.

Pero indirectamente puedes . Usando su dirección, puede acceder a una variable estática desde otro archivo.
Por ejemplo,
1. Tome un puntero global y almacene la dirección de la variable estática, acceda a través del puntero desde otro archivo
2. Pase el puntero en el argumento de la función y acceda a la variable en esa función en otro archivo.

Nunca hay una razón para acceder a una variable estática en otro archivo. Hay dos formas de declarar variables en el alcance del archivo (funciones externas).
Variable global int i;
Ventajas:

  • es válido durante toda la ejecución del programa.

Desventajas

  • Se puede acceder con extern para crear código de espagueti.
  • “Contamina” el espacio de nombres global.
  • No es seguro para subprocesos.
  • Inicializado al inicio del programa, lo que crea una sobrecarga del programa.

Variable local / privada static int i;
Ventajas:

  • es válido durante toda la ejecución del programa.
  • Solo se puede acceder mediante archivos en el mismo “módulo” / “unidad de traducción” (mismo archivo .c).
  • Proporciona encapsulación privada ya que la persona que llama no puede acceder a ella.

Desventajas

  • No es seguro para subprocesos.
  • Inicializado al inicio del programa, lo que crea una sobrecarga del programa.