¿Cómo uso extern para compartir variables entre archivos fuente?

4 minutos de lectura

Sé que las variables globales en C a veces tienen el extern palabra clave. Que es un extern ¿variable? ¿Cómo es la declaración? ¿Cuál es su alcance?

Esto está relacionado con compartir variables entre archivos de origen, pero ¿cómo funciona exactamente? donde uso extern?

avatar de usuario
Luciano

                 declare | define   | initialize |
                ----------------------------------

extern int a;    yes          no           no
-------------
int a = 2019;    yes          yes          yes
-------------
int a;           yes          yes          no
-------------

La declaración no asignará memoria (la variable debe definirse para la asignación de memoria), pero la definición sí lo hará. Esta es solo otra vista simple de la palabra clave externa, ya que las otras respuestas son realmente geniales.

  • Más generalmente, un declaración es una promesa de que el nombre se podrá resolver exactamente en una definición en el momento del enlace. Un extern declara una variable sin definir.

    – miente ryan

    30 de noviembre de 2010 a las 2:16

avatar de usuario
Juan Weiss

Un extern variable es una declaración (gracias a sbi por la corrección) de una variable que está definida en otra unidad de traducción. Eso significa que el almacenamiento de la variable se asigna en otro archivo.

Di que tienes dos .c-archivos test1.c y test2.c. Si define una variable global int test1_var; en test1.c y le gustaría acceder a esta variable en test2.c tienes que usar extern int test1_var; en test2.c.

Muestra completa:

$ cat test1.c 
int test1_var = 5;
$ cat test2.c
#include <stdio.h>

extern int test1_var;

int main(void) {
    printf("test1_var = %d\n", test1_var);
    return 0;
}
$ gcc test1.c test2.c -o test
$ ./test
test1_var = 5

  • No hay “pseudo-definiciones”. Es una declaración.

    – sbi

    16 de septiembre de 2009 a las 14:18

  • En el ejemplo anterior, si cambio el extern int test1_var; para int test1_var;, el enlazador (gcc 5.4.0) todavía pasa. Asi es extern realmente necesario en este caso?

    – cabeza de radio

    24 de marzo de 2018 a las 3:15


  • @radiohead: En mi respuesta, encontrará la información de que dejar caer el extern es una extensión común que a menudo funciona, y específicamente funciona con GCC (pero GCC está lejos de ser el único compilador que lo admite; prevalece en los sistemas Unix). Puede buscar “J.5.11” o la sección “No tan buena manera” en mi respuesta (lo sé, es es de largo) y el texto cercano que lo explica (o intenta hacerlo).

    –Jonathan Leffler

    16 de junio de 2018 a las 19:44


  • Una declaración externa ciertamente no tiene que estar definida en otra unidad de traducción (y comúnmente no lo está). De hecho, declaración y definición pueden ser lo mismo.

    – Recuerda a Mónica

    28 de diciembre de 2019 a las 0:35

Extern es la palabra clave que usa para declarar que la variable en sí reside en otra unidad de traducción.

Entonces, puede decidir usar una variable en una unidad de traducción y luego acceder a ella desde otra, luego en la segunda la declara como externa y el enlazador resolverá el símbolo.

Si no lo declara como externo, obtendrá 2 variables con el mismo nombre pero sin ninguna relación, y un error de múltiples definiciones de la variable.

  • No hay “pseudo-definiciones”. Es una declaración.

    – sbi

    16 de septiembre de 2009 a las 14:18

  • En el ejemplo anterior, si cambio el extern int test1_var; para int test1_var;, el enlazador (gcc 5.4.0) todavía pasa. Asi es extern realmente necesario en este caso?

    – cabeza de radio

    24 de marzo de 2018 a las 3:15


  • @radiohead: En mi respuesta, encontrará la información de que dejar caer el extern es una extensión común que a menudo funciona, y específicamente funciona con GCC (pero GCC está lejos de ser el único compilador que lo admite; prevalece en los sistemas Unix). Puede buscar “J.5.11” o la sección “No tan buena manera” en mi respuesta (lo sé, es es de largo) y el texto cercano que lo explica (o intenta hacerlo).

    –Jonathan Leffler

    16 de junio de 2018 a las 19:44


  • Una declaración externa ciertamente no tiene que estar definida en otra unidad de traducción (y comúnmente no lo está). De hecho, declaración y definición pueden ser lo mismo.

    – Recuerda a Mónica

    28 de diciembre de 2019 a las 0:35

avatar de usuario
Comunidad

Agregar un extern convierte una variable definición en una variable declaración. Consulte este hilo sobre cuál es la diferencia entre una declaración y una definición.

  • que diferencia entre int foo y extern int foo (alcance del archivo)? Ambos son declaración, ¿no es así?

    usuario1150105

    8 de noviembre de 2012 a las 19:07

  • @user14284: Ambos son declaraciones solo en el sentido de que cada definición también es una declaración. Pero me vinculé a una explicación de esto. (“Vea este hilo sobre cuál es la diferencia entre una declaración y una definición”.) ¿Por qué no simplemente sigue el enlace y lee?

    – sbi

    9 de noviembre de 2012 a las 9:12


¿Ha sido útil esta solución?