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
?
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
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;
paraint test1_var;
, el enlazador (gcc 5.4.0) todavía pasa. Asi esextern
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;
paraint test1_var;
, el enlazador (gcc 5.4.0) todavía pasa. Asi esextern
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
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
yextern 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