stringtranslate.com

Variable externa

En el lenguaje de programación C y su predecesor B , una variable externa es una variable definida fuera de cualquier bloque de función. Por otro lado, una variable local (automática) es una variable definida dentro de un bloque de función.

Como alternativa a las variables automáticas, es posible definir variables que sean externas a todas las funciones, es decir, variables a las que cualquier función pueda acceder por su nombre. (Este mecanismo es bastante parecido a las variables COMUNES de Fortran o Pascal declaradas en el bloque más externo). Debido a que las variables externas son accesibles globalmente, se pueden utilizar en lugar de listas de argumentos para comunicar datos entre funciones. Además, debido a que las variables externas permanecen en existencia de forma permanente, en lugar de aparecer y desaparecer a medida que se invocan y se sale de las funciones, conservan sus valores incluso después de que las funciones que las establecieron hayan regresado.

Definición, declaración y externpalabra clave

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 por medio de extrnuna declaración.

Usando el siguiente código en el tutorial como ejemplo: [1]

principal ( ) { 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 e introducidas en la mainfunción mediante extrndeclaraciones.

Para entender cómo se relacionan las variables externas con la externpalabra clave, es necesario conocer la diferencia entre definir y declarar una variable. Cuando se define una variable , el compilador asigna memoria para esa variable y posiblemente también inicializa su contenido a algún valor. Cuando se declara una variable , el compilador requiere que la variable se defina en otro lugar. La declaración informa al compilador que existe una variable con ese nombre y tipo, pero el compilador no necesita asignarle memoria ya que está asignada en otro lugar. La externpalabra clave significa "declarar sin definir". En otras palabras, es una forma de declarar explícitamente una variable, o de forzar una declaración sin una definición. También es posible definir explícitamente una variable, es decir, forzar una definición. Se hace asignando un valor de inicialización a una variable. Si no externestán presentes ni la palabra clave ni un valor de inicialización, la declaración puede ser una declaración o una definición. Depende del compilador analizar los módulos del programa y decidir.

Una variable debe definirse exactamente una vez en uno de los módulos del programa. Si no hay definición o hay más de una, se produce un error, posiblemente en la etapa de enlace. Una variable puede declararse muchas veces, siempre que las declaraciones sean coherentes entre sí y con la definición (algo que los archivos de cabecera facilitan enormemente). Puede declararse en muchos módulos, incluido el módulo donde se definió, e incluso muchas veces en el mismo módulo. Pero normalmente no tiene sentido declararla más de una vez en un módulo.

Una variable externa también puede ser declarada dentro de una función. En este caso externse debe utilizar la palabra clave, de lo contrario el compilador la considerará una definición de una variable local ( automática ), que tiene un alcance, duración y valor inicial diferentes. Esta declaración solo será visible dentro de la función en lugar de en todo el módulo de la función.

La externpalabra clave aplicada a un prototipo de función no hace absolutamente nada (la externpalabra clave aplicada a una definición de función, por supuesto, no tiene sentido). Un prototipo de función es siempre 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 que una función se defina dentro de una función.

Una variable externa debe definirse, exactamente una vez, fuera de cualquier función; esto reserva un espacio de almacenamiento para ella. La variable también debe declararse en cada función que quiera acceder a ella; esto indica el tipo de la variable. La declaración puede ser una externdeclaración explícita o puede estar implícita en el contexto. ... Debe tener en cuenta que usamos las palabras definición y declaración con cuidado cuando nos referimos a variables externas en esta sección. Definición se refiere al lugar donde se crea la variable o se le asigna almacenamiento; declaración se refiere a lugares donde se indica la naturaleza de la variable pero no se le asigna almacenamiento.

Alcance, duración 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, una declaración o la definición de la variable externa debe estar antes de la definición de la función en el código fuente. O debe haber una declaración de la variable, con la palabra clave 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: solo las funciones del mismo módulo en el que se definió pueden acceder a la variable. 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, pero no puede referirse a ella por su nombre.

También es posible utilizar 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 sale (de ahí el nombre "variable automática"). Su valor no se conserva entre llamadas de función. Con la staticpalabra clave, la variable se asigna cuando se inicia el programa y se libera cuando el programa termina. Su valor no se pierde entre llamadas de función. La variable sigue siendo local, ya que solo se puede acceder a ella por 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 (de nuevo sin hacer referencia a ella por nombre).

Las variables externas se asignan e inicializan cuando se inicia el programa y la memoria solo se libera cuando el programa termina. Su duración es la misma que la del programa.

Si la inicialización no se realiza explícitamente, las variables estáticas externas (estáticas o no) y las variables estáticas locales se inicializan a cero. Las variables automáticas locales no se inicializan, es decir, contienen valores "basura".

La staticpalabra clave aplicada a una definición de función cambia el enlace de la función de modo que solo sea visible desde la unidad de traducción donde se encuentra su definición. Esto evita que la función sea llamada por su nombre desde fuera de su módulo (sigue siendo posible pasar un puntero de función fuera del módulo y usarlo para invocar la función). Declarar una función usando 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 en realidad asigna // además de describir int global_variable ;    // Prototipo de función (declaración), asume que está definido en otro lugar, normalmente en el archivo de inclusión. void some_function ( void );     int main ( void ) { variable_global = 1 ; alguna_funcion (); devolver 0 ; }         

Archivo 2:

 // Declaración implícita, esto solo describe y // asume que está asignado en otro lugar, normalmente desde include extern int global_variable ;      // Encabezado de función (definición) void some_function ( void ) { ++ global_variable ; }      

En este ejemplo, la variable Global_Variable se define en el Archivo 1. Para poder utilizar la misma variable en el Archivo 2, se debe declarar . Independientemente de la cantidad de archivos, una variable global solo se define una vez; sin embargo, se debe declarar en cualquier archivo que no sea el que contiene la definición.

Si el programa se encuentra en varios archivos fuente y se define una variable en el archivo1 y se utiliza en los archivos2 y3, se necesitan declaraciones externas en los archivos2 y3 para conectar las apariciones de la variable. La práctica habitual es recopilar las declaraciones externas de variables y funciones en un archivo separado, históricamente llamado encabezado, que se incluye con #include al principio de cada archivo fuente. El sufijo .h es convencional para los nombres de encabezado.

La metodología normal es que la asignación y las definiciones reales vayan en archivos .c, pero las meras declaraciones y prototipos no asignan y solo describen los tipos y parámetros para que el compilador pueda funcionar correctamente, y esa información pertenece a un archivo de encabezado .h que otros pueden incluir de manera segura sin ningún posible conflicto.

Véase también

Referencias

  1. ^ ab Kernighan, BW UNA INTRODUCCIÓN TUTORIAL AL ​​IDIOMA B. Murray Hill, Nueva Jersey: Laboratorios Bell.

Enlaces externos