c scope storage-class-specifier

¿Cuál es la diferencia entre el "alcance del archivo" y el "alcance del programa"?



scope storage-class-specifier (4)

Se dice que una variable declarada globalmente tiene alcance de programa
Una variable declarada globalmente con palabra clave estática se dice que tiene alcance de archivo.

Por ejemplo:

int x = 0; // **program scope** static int y = 0; // **file scope** static float z = 0.0; // **file scope** int main() { int i; /* block scope */ /* . . . */ return 0; }

¿Cuál es la diferencia entre estos dos?


En C99, no hay nada llamado "alcance de programa". En su ejemplo, la variable x tiene un alcance de archivo que termina al final de la unidad de traducción. Las variables y y z que se declaran static también tienen el alcance del archivo pero con un enlace interno.

C99 (6.2.2 / 3) Si la declaración de un identificador de alcance de archivo para un objeto o una función contiene el estático especificador de la clase de almacenamiento, el identificador tiene un enlace interno

Además, la variable x tiene un enlace externo, lo que significa que el nombre x puede ser accesible a otras unidades de traducción o en todo el programa.

C99 (6.2.2 / 5) Si la declaración de un identificador para un objeto tiene alcance de archivo y no tiene especificador de clase de almacenamiento, su enlace es externo.


Los programas C se pueden escribir en varios archivos, que se combinan mediante un enlazador en la ejecución final. Si su programa completo está en un archivo, entonces no hay diferencia. Pero en el software complejo del mundo real que incluye el uso de bibliotecas de funciones en archivos distintos, la diferencia es significativa.


No se puede acceder directamente a las variables declaradas como static desde otros archivos. Por el contrario, se puede acceder a los no static desde otros archivos si se declaran extern en esos otros archivos.

Ejemplo:

foo.c

int foodata; static int foodata_private; void foo() { foodata = 1; foodata_private = 2; }

foo.h

void foo();

C Principal

#include "foo.h" #include <stdio.h> int main() { extern int foodata; /* OK */ extern int foodata_private; /* error, won''t compile */ foo(); printf("%d/n", foodata); /* OK */ return 0; }

En general, se deben evitar las variables globales. Sin embargo, en aplicaciones del mundo real, a menudo son útiles. Es común mover el extern int foo; Declaraciones a un archivo de encabezado compartido (foo.h en el ejemplo).


Una variable con alcance de archivo solo es visible desde su punto de declaración hasta el final del archivo. Un archivo hace referencia al archivo de programa que contiene el código fuente. Puede haber más de un archivo de programa dentro de un programa grande. Las variables con alcance del programa son visibles dentro de todos los archivos (no solo en el archivo en el que está definido), las funciones y otros bloques en todo el programa. Para más información. verifique esto: Ámbito y clases de almacenamiento en C.