En el lenguaje de programación C y su predecesor B , una variable externa es aquella definida fuera de cualquier bloque de función. Por otro lado, una variable local (automática) es aquella definida dentro de un bloque de función.
Como alternativa a las variables automáticas, es posible definir variables externas a todas las funciones, es decir, variables a las que cualquier función puede acceder por su nombre. (Este mecanismo es similar a las variables COMMON de Fortran o Pascal declaradas en el bloque más externo). Dado que las variables externas son accesibles globalmente, pueden utilizarse en lugar de listas de argumentos para comunicar datos entre funciones. Además, como las variables externas existen de forma permanente, en lugar de aparecer y desaparecer al llamar y finalizar las funciones, conservan sus valores incluso después de que las funciones que las establecieron hayan finalizado.
Definición, declaración y palabra externclave
extrn
En B, todas las variables deben declararse, como auto, extrn, o implícitamente como argumentos de función. [ 1 ] Una variable externa se define fuera de las funciones, tiene una vida útil de toda la ejecución del programa y se introduce en la función mediante la extrndeclaración.
Utilizando el siguiente código del tutorial como ejemplo: [ 1 ]
main ( ) { extrn a , b , c ; putchar ( a ); putchar ( b ); putchar ( c ); putchar ( ' !* n ' ); }a ' infierno ' ; b ' o , w ' ; c ' mundo ' ;a, b, cson todas variables externas del programa definidas fuera de las funciones, y se introducen en la mainfunción mediante extrndeclaraciones.
externo
Para comprender la relación entre las variables externas y la externpalabra clave `declare`, es necesario conocer la diferencia entre definir y declarar una variable. Al definir una variable , el compilador le asigna memoria y posiblemente también inicializa su contenido con algún valor. Al declarar una variable , el compilador requiere que se defina en otro lugar. La declaración informa al compilador de que existe una variable con ese nombre y tipo, pero el compilador no necesita asignarle memoria, ya que se asigna en otro lugar. La externpalabra clave `declare` significa "declarar sin definir". En otras palabras, es una forma de declarar explícitamente una variable o de forzar una declaración sin definición. También es posible definir explícitamente una variable, es decir, forzar una definición. Esto se logra asignando un valor de inicialización a la variable. Si no externse utiliza la palabra clave `declare` ni se especifica un valor de inicialización, la instrucción puede ser una declaración o una definición. El compilador es quien analiza los módulos del programa y decide.
Una variable debe definirse exactamente una vez en uno de los módulos del programa. Si no hay ninguna definición o hay más de una, se produce un error, posiblemente durante la fase de enlace. Una variable puede declararse varias veces, siempre que las declaraciones sean coherentes entre sí y con la definición (algo que facilitan enormemente los archivos de cabecera ). Puede declararse en varios módulos, incluido el módulo donde se definió, e incluso varias veces en el mismo módulo. Sin embargo, por lo general, no tiene sentido declararla más de una vez en un módulo.
También se puede declarar una variable externa dentro de una función. En este caso, externdebe utilizarse la palabra clave `external`, de lo contrario, el compilador la interpretará como la definición de una variable local ( automática ), que tiene un ámbito, un tiempo de vida y un valor inicial diferentes. Esta declaración solo será visible dentro de la función, no en todo el módulo de la función.
La externpalabra clave aplicada a un prototipo de función no tiene ningún efecto (la externpalabra clave aplicada a una definición de función, por supuesto, carece de sentido). Un prototipo de función siempre es una declaración y nunca una definición. Además, en C estándar, una función siempre es externa, pero algunas extensiones del compilador permiten definir una función dentro de otra.
Una variable externa debe definirse una sola vez, fuera de cualquier función; esto reserva espacio de almacenamiento para ella. La variable también debe declararse en cada función que desee acceder a ella; esto indica el tipo de variable. La declaración puede ser explícita
externo implícita por contexto. ... Cabe destacar que utilizamos los términos "definición" y "declaración" con cuidado al referirnos a las variables externas en esta sección. La definición se refiere al lugar donde se crea la variable o se le asigna espacio de almacenamiento; la declaración se refiere a los lugares donde se indica la naturaleza de la variable, pero no se le asigna espacio de almacenamiento.
Alcance, vida útil y staticpalabra clave
Una variable externa puede ser accedida por todas las funciones en todos los módulos de un programa. Es una variable global . Para que una función pueda usar la variable, su declaración o definición debe estar antes de la definición de la función en el código fuente. O bien, debe haber una declaración de la variable, con la palabra clave `global` extern, dentro de la función.
La staticpalabra clave ( staticy externson mutuamente excluyentes), aplicada a la definición de una variable externa, cambia esto un poco: la variable solo puede ser accedida por las funciones del mismo módulo donde se definió. Pero es posible que una función del mismo módulo pase una referencia (puntero) de la variable a otra función de otro módulo. En este caso, aunque la función esté en otro módulo, puede leer y modificar el contenido de la variable ; simplemente no puede referirse a ella por su nombre.
También es posible usar la staticpalabra clave en la definición de una variable local . Sin la staticpalabra clave, la variable se asigna automáticamente cuando se llama a la función y se libera cuando la función finaliza (de ahí el nombre de "variable automática"). Su valor no se conserva entre llamadas a la función. Con la staticpalabra clave, la variable se asigna cuando el programa comienza y se libera cuando el programa finaliza. Su valor no se pierde entre llamadas a la función. La variable sigue siendo local, ya que solo se puede acceder a ella por su nombre dentro de la función que la definió. Pero se puede pasar una referencia (puntero) a ella a otra función, lo que le permite leer y modificar el contenido de la variable (nuevamente sin referirse a ella por su nombre).
Las variables externas se asignan e inicializan al iniciar el programa, y la memoria solo se libera al finalizar este. Su ciclo de vida coincide con el del programa.
Si la inicialización no se realiza explícitamente, las variables estáticas externas (estáticas o no) y locales se inicializan a cero. Las variables automáticas locales no se inicializan, es decir, contienen valores "basura".
La staticpalabra clave aplicada a la definición de una función modifica su vinculación, de modo que solo es visible desde la unidad de traducción donde se encuentra su definición. Esto impide que la función se llame por su nombre desde fuera de su módulo (aunque sigue siendo posible pasar un puntero a la función fuera del módulo y usarlo para invocarla). Declarar una función con la staticpalabra clave también es una buena manera de mantener su nombre corto y evitar conflictos de nombres.
Ejemplo (lenguaje de programación C)
Archivo 1:
// Definición explícita, esto realmente asigna // además de describir int global_variable ;// Prototipo de función (declaración), se asume // que está definido en otro lugar, normalmente en un archivo de inclusión. void someFunction ( void );int main ( void ) { variable_global = 1 ; algunaFunción (); return 0 ; }Archivo 2:
// Declaración implícita, esto solo describe y // asume que se asigna en otro lugar, normalmente desde include extern int global_variable ;// Encabezado de la función (definición) void someFunction ( void ) { ++ variable_global ; }En este ejemplo, la variable Global_Variable se define en el Archivo 1. Para utilizar la misma variable en el Archivo 2, debe declararse . Independientemente del número de archivos, una variable global se define solo una vez; sin embargo, debe declararse en cualquier archivo que no contenga la definición.
Si el programa se encuentra en varios archivos fuente y una variable se define en el archivo 1 y se utiliza en los archivos 2 y 3, entonces se necesitan declaraciones extern en los archivos 2 y 3 para conectar las instancias de la variable. La práctica habitual consiste en agrupar las declaraciones extern de variables y funciones en un archivo aparte, tradicionalmente llamado archivo de cabecera, que se incluye mediante #include al principio de cada archivo fuente. El sufijo .h es convencional para los nombres de los archivos de cabecera.
La metodología habitual consiste en que la asignación de memoria y las definiciones reales se incluyan en archivos .c, pero las meras declaraciones y prototipos no realizan asignaciones, sino que simplemente describen los tipos y parámetros para que el compilador funcione correctamente. Esa información pertenece a un archivo de cabecera .h que otros pueden incluir de forma segura sin ningún posible conflicto.
Véase también
- Declaración : construcción del lenguaje de programación que especifica las propiedades de un identificador.
- Prototipo de función : Declaración del nombre y la firma de tipo de una función, pero no del cuerpo.
- Variable global : en programación informática, una variable accesible en todo un programa informático.
- Enlazador (informática) – Programa que combina archivos de compilación intermedios en un archivo ejecutable.
- Variable local : en programación informática, una variable que solo se puede usar en una parte de un programa (el ámbito).
- Alcance : parte de un programa informático donde una vinculación de nombre determinada es válida. Páginas que muestran descripciones breves de los destinos de redirección.
- Variable estática : variable de programación que persiste durante la vida útil del programa.
- El lenguaje de programación C – Libro de Brian Kernighan y Dennis Ritchie
Referencias
Enlaces externos
- Referencia del lenguaje C de Microsoft: Especificadores de clase de almacenamiento para declaraciones de nivel externo
- "La norma C (C99 con correcciones técnicas TC1, TC2 y TC3 incluidas)" (PDF) . (3,61 MiB ) . En particular, véanse las secciones 6.2.2 (Vinculación de identificadores), 6.2.4 (Duración de almacenamiento de objetos), 6.7.1 (Especificadores de clase de almacenamiento) y 6.9 (Definiciones externas).
- Variable (informática)