¿Qué es un concepto detrás de usar extern en c / c ++?

Lo siento por este tipo de pregunta. Pero tengo mucha curiosidad acerca de la palabra clave extern en C\C++ .

Mientras buscaba una explicación para extern pude saber que extern dice al comstackdor que la variable o función ya está definida en algún otro archivo o progtwig.

Pero si este es un caso, ¿por qué usamos extern ?

Como probé algunos códigos de la siguiente manera:

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

Este código me da un mensaje de error como unresolved external symbol "int var" (?var@@3HA) .

y si estoy usando algún código como:

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

No muestra ningún error y da el mismo valor que he definido en la función principal.

Entonces, ¿Puede alguien ayudarme con el comportamiento de extern ? Estoy un poco confundido en esto. Por favor, perdóname si no es una pregunta válida. Gracias de antemano.

extern se usa para referirse a una variable en otra unidad de traducción (“archivo fuente”). Por ejemplo, su código en main.c se ve así:

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

Este código contiene una statement para un entero llamado var, pero ninguna definición, porque extern explícitamente dice: “la definición para esto está en otra parte”

Podría definir otro archivo fuente, digamos, other.c:

 int var = 0; 

Luego, después de agregar esta nueva unidad de traducción a su comando de comstackción, su progtwig se vinculará bien y el código de ambos archivos puede operar en la variable var compartida.

En la segunda versión, simplemente anula la statement de la variable externa con una variable local en su función principal. Dado que la variante externa ya no se usa (ODR), el enlazador no la requiere, por lo que su ejecutable puede comstackrse con éxito.

La primera versión falla, ya que también debe proporcionar una definición de la variable declarada extern , es decir, enlazando con algún otro archivo C que tenga

 int var; 

en su ámbito global.

El segundo tiene éxito ya que el int var = 10; línea en main() sombrea la statement global; Por lo general, esto es algo malo que se debe hacer si desea que la variable sea externa, es decir, que se comparta entre muchos archivos C. Por supuesto, este intercambio en sí mismo a menudo también es bastante malo (ver: variables globales ).

extern se utiliza para indicar que una variable existe en otra unidad de comstackción. Si tuvieras:

main.cpp

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

y:

var.cpp

 int var; 

Entonces, no habría recibido el error del enlazador, ya que el enlazador habría conectado el uso de var en main.cpp con su decleration en var.cpp

En su segundo ejemplo, ha definido una extern int var pero nunca hace referencia a ella. El int var = 10 es un int var completamente diferente del externo. Cuando el enlazador lo ejecuta, se da cuenta de que nunca se usa la variable extern int var , por lo que no se molesta en buscarla.

Le sugiero que debe aclarar su comprensión de la definición y la statement de la variable.

La palabra clave externa se usa cuando quiere decir que a la variable se le asignó memoria, solo desea declarar la variable.

Cuando declare cualquier variable usando un comstackdor de palabras clave externas, intentará encontrar la definición de la misma variable que puede estar presente antes o después de la statement.

En el primer caso, simplemente está declarando que la variable no le asigna ninguna memoria, es decir, que no define la variable.

puede pasar por esto para una mejor comprensión de la palabra clave externa.

Si ha declarado una variable global, digamos double myvar=5 en file1.cpp y desea acceder a esa variable en file2.cpp, entonces en su archivo2.cpp declara como

 extern double myvar; 

En C ++, cada archivo se llama una unidad de comstackción. Para que el archivo se compile en un archivo de objeto, necesita todas las variables declaradas, sin embargo, no necesita inicializar o hacer una asignación en esas variables.

Volviendo al ejemplo:

File1.cpp: double myvar=5 esto es tanto una statement como una inicialización. Puede comstackr file1.cpp a file1.o.

File2.cpp: Suponiendo que está utilizando myvar en algún lugar de file2.cpp y también desea acceder al valor (quizás después de un cálculo) en file1.cpp. Por lo tanto, para poder comstackr file2.cpp en file2.o, debe declarar extern double myvar , para que se pueda comstackr file2.cpp. Esto complacerá al comstackdor y deja la tarea al enlazador.

Ahora que ha comstackdo estos archivos, tendrá archivos de objetos (unidades de traducción) nombrados como (si está utilizando g ++) file1.o file2.o. Ahora es trabajo del enlazador vincularlos entre sí y dejar que file2.o acceda a myvar .

Declarar una variable extern le dice al comstackdor que la instancia real de la variable está en otro lugar. Si no lo proporciona en otro lugar, la etapa de enlace fallará.

En su segundo ejemplo, no hace referencia a la variable extern declarada en absoluto. Usted declara uno nuevo en el scope de su función principal que oculta la statement global.