stringtranslate.com

variable externa

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

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 nombre. (Este mecanismo es más bien como las variables COMMON de Fortran o Pascal declaradas en el bloque más externo). Debido a que las variables externas son accesibles globalmente, se pueden usar en lugar de listas de argumentos para comunicar datos entre funciones. Además, debido a que las variables externas existen permanentemente, en lugar de aparecer y desaparecer cuando se llaman y cierran funciones, conservan sus valores incluso después de que las funciones que las establecieron hayan regresado.

Definición, declaración y externpalabra clave.

Para comprender 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 con 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 realiza 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. Corresponde al 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 vinculación. Una variable puede declararse muchas veces, siempre que las declaraciones sean coherentes entre sí y con la definición (algo que los archivos de encabezado 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 declararlo 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 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 almacenamiento para ello. La variable también debe ser declarada en cada función que quiera acceder a ella; esto indica el tipo de variable. La declaración puede ser una externdeclaración explícita o puede estar implícita por el contexto. ... Debe tener en cuenta que utilizamos las palabras definición y declaración con cuidado cuando nos referimos a variables externas en esta sección. La definición se refiere al lugar donde se crea la variable o se le asigna almacenamiento; La declaración se refiere a lugares donde se indica la naturaleza de la variable pero no se asigna almacenamiento.

Alcance, duración y staticpalabra clave

Todas las funciones de todos los módulos de un programa pueden acceder a una variable externa. Es una variable global . Para que una función pueda utilizar 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 en el mismo módulo donde se definió pueden acceder a la variable. Pero es posible que una función en el mismo módulo pase una referencia (puntero) de la variable a otra función en 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 hacer referencia 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 a funciones. Con la staticpalabra clave, la variable se asigna cuando se inicia el programa y se libera cuando finaliza el programa. Su valor no se pierde entre llamadas a funciones. 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 otra función, permitiéndole leer y modificar el contenido de la variable (nuevamente sin hacer referencia a ella por su nombre).

Las variables externas se asignan e inicializan cuando se inicia el programa y la memoria solo se libera cuando finaliza el programa. Su vida útil 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 locales se inicializan a cero. Las variables automáticas locales no están inicializadas, es decir, contienen valores "basura".

La staticpalabra clave aplicada a la definición de una función cambia el vínculo de la función para 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 breve 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 supone // definido en otro lugar, normalmente desde el archivo de inclusión. anular alguna_función ( anular );     int principal ( vacío ) { variable_global = 1 ; alguna_función (); devolver 0 ; }         

Archivo 2:

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

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

Si el programa está en varios archivos fuente y una variable está definida en el archivo1 y se usa en el archivo2 y el archivo3, entonces se necesitan declaraciones externas en el archivo2 y el archivo3 para conectar las apariciones de la variable. La práctica habitual es recopilar 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 nombres de encabezados.

La metodología normal es que la asignación y las definiciones reales vayan a 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 incluirse de forma segura sin ningún posible conflicto.

Ver también

enlaces externos