Comprender la palabra clave «externa» en C

Estoy seguro de que esta publicación será tan interesante e informativa para los vírgenes de C (es decir, los principiantes) como para aquellos que están bien versados ​​en C. Permítanme comenzar diciendo que la palabra clave extern se aplica a las variables de C (objetos de datos ) y funciones C. Básicamente, la palabra clave extern amplía la visibilidad de las variables y funciones de C. Esa es probablemente la razón por la que se llamó extern.
Aunque la mayoría de la gente probablemente entienda la diferencia entre la «declaración» y la «definición» de una variable o función, en aras de la exhaustividad, me gustaría aclararlas. 

  • La declaración de una variable o función simplemente declara que la variable o función existe en algún lugar del programa, pero la memoria no está asignada para ellos. La declaración de una variable o función cumple un papel importante: le dice al programa cuál será su tipo. En el caso de declaraciones de funciones , también le dice al programa los argumentos, sus tipos de datos, el orden de esos argumentos y el tipo de retorno de la función. Así que eso es todo sobre la declaración.
  • En cuanto a la definición , cuando definimos una variable o función, además de todo lo que hace una declaración, también asigna memoria para esa variable o función. Por lo tanto, podemos pensar en la definición como un superconjunto de la declaración (o la declaración como un subconjunto de la definición).
  • Extern es un nombre corto para externo.
  • se utiliza cuando un archivo en particular necesita acceder a una variable de otro archivo.

C

#include <stdio.h>
 
extern int a;     // int var;  ->  declaration and definition
                  // extern int var;  -> declaration
 
int main()
{ 
    printf("%d", a);
  
   return 0;
}
  • Cuando escribimos extern some_data_type some_variable_name; no se asigna memoria. Solo se anuncia la propiedad de la variable.
  • Se permiten múltiples declaraciones de variables externas dentro del archivo. Este no es el caso de las variables automáticas.
  • La variable externa le dice al compilador «salga de mi alcance y encontrará la definición de la variable que declaré».
  • El compilador cree que todo lo que dijo la variable externa es verdadero y no produce ningún error. Linker arroja un error cuando encuentra que no existe tal variable.
  • Cuando se inicializa una variable externa, se asigna memoria para esta y se considerará definida.

Una variable o función se puede declarar cualquier número de veces, pero solo se puede definir una vez. (Recuerde el principio básico de que no puede tener dos ubicaciones de la misma variable o función).
Ahora volvamos a la palabra clave externa. Primero, consideremos el uso de extern en funciones. Resulta que cuando se declara o define una función, se asume implícitamente la palabra clave extern. Cuando escribimos.

int foo(int arg1, char arg2);

El compilador lo trata como:

extern int foo(int arg1, char arg2);

Dado que la palabra clave extern extiende la visibilidad de la función a todo el programa, la función se puede usar (llamar) en cualquier parte de cualquiera de los archivos del programa completo, siempre que esos archivos contengan una declaración de la función. (Con la declaración de la función en su lugar, el compilador sabe que la definición de la función existe en otro lugar y continúa y compila el archivo). Así que eso es todo acerca de las funciones externas.
Ahora consideremos el uso de extern con variables. Para empezar, ¿cómo declararías una variable sin definirla ? Harías algo como esto:

extern int var;

Aquí, se ha declarado una variable de tipo entero llamada var (aún no se ha definido, por lo que hasta ahora no hay asignación de memoria para var). Y podemos hacer esta declaración tantas veces como queramos. Hasta aquí todo bien. 🙂
Ahora, ¿cómo definirías var? Harías esto:

int var = 10;

En esta línea, se ha declarado y definido una variable de tipo entero llamada var (recuerde que definición es el superconjunto de declaración ). Como esta es una definición, también se asigna la memoria para var. Ahora aquí viene la sorpresa. Cuando declaramos/definimos una función, vimos que la palabra clave extern estaba presente implícitamente. Pero este no es el caso con las variables. Si lo fuera, nunca se les asignaría memoria. Por lo tanto, necesitamos incluir la palabra clave extern explícitamente cuando queremos declarar variables sin definirlas. Además, como la palabra clave extern extiende la visibilidad a todo el programa, al usar la palabra clave extern con una variable, podemos usar la variable en cualquier parte del programa siempre que incluyamos su declaración, la variable está definida en alguna parte.
Ahora tratemos de entender extern con ejemplos.
Ejemplo 1: 

c

int var;
int main(void)
{
   var = 10;
   return 0;
}

Este programa compila con éxito. var se define (y se declara implícitamente) globalmente.
Ejemplo 2: 

c

extern int var;
int main(void)
{
  return 0;
}

Este programa compila con éxito. Aquí solo se declara var. Observe que var nunca se usa, por lo que no surgen problemas.
Ejemplo 3: 

c

extern int var;
int main(void)
{
  var = 10;
  return 0;
}

Este programa arroja un error en la compilación (durante la fase de vinculación, más información aquí ) porque var está declarado pero no definido en ninguna parte. Esencialmente, a la var no se le asigna ninguna memoria. Y el programa está tratando de cambiar el valor a 10 de una variable que no existe en absoluto.
Ejemplo 4: 

c

#include "somefile.h"
extern int var;
int main(void)
{
 var = 10;
 return 0;
}

Suponiendo que somefile.h contenga la definición de var, este programa se compilará con éxito.
Ejemplo 5: 

c

extern int var = 0;
int main(void)
{
 var = 10;
 return 0;
}

¿Crees que este programa funcionará? Bueno, aquí viene otra sorpresa de los estándares C. Dicen que… si solo se declara una variable y también se proporciona un inicializador con esa declaración, entonces se asignará la memoria para esa variable; en otras palabras, esa variable se considerará como definida. Por lo tanto, según el estándar C, este programa se compilará correctamente y funcionará.
Ese fue un vistazo preliminar a la palabra clave extern en C.
En resumen, podemos decir: 

  1. Una declaración se puede hacer cualquier número de veces, pero la definición solo una vez.
  2. la palabra clave extern se usa para ampliar la visibilidad de variables/funciones.
  3. Dado que las funciones son visibles en todo el programa de forma predeterminada, el uso de extern no es necesario en las declaraciones o definiciones de funciones. Su uso es implícito.
  4. Cuando se usa extern con una variable, solo se declara, no se define.
  5. Como excepción, cuando una variable externa se declara con inicialización, también se toma como la definición de la variable.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *