ejemplo - El uso de extern en c++
extern function c (2)
En C ++, al igual que C antes, cada archivo de origen se compila en un archivo de objeto. Luego, todos los archivos de objetos están vinculados para crear el programa ejecutable.
Para compartir símbolos (funciones, variables globales), hay varias palabras clave que le dicen al compilador cuáles son locales para el archivo, cuáles son privadas y cuáles se importan de otro archivo.
La palabra clave `extern ''significa que se puede acceder a un símbolo, pero no se puede definir. Debe definirse (como global) en algún otro módulo. Si no, obtienes un error de ''símbolo indefinido'' en el momento del enlace.
Me ha costado entender cómo funciona ''extern''. He buscado en Google pero no parece haber un caso de ejemplo en particular que esté intentando
Si tengo un archivo main.cpp que hace referencia a one.h y en él tengo una lista llamada LIST1 (que es una matriz doble de 100 x 100), entonces tengo doble List1 [100] [100];
¿Cómo puedo usar esta lista en one.cpp por favor?
extern double LIST1[100][100]
no está trabajando :/
main.cpp:
#include "one.h"
extern double LIST1[100][100];
one.cpp:
void one::useList()
{
for(j = 0; j < 100; j++)
{
for(i = 0; i < 100; i++)
{
LIST1[j,i] = 0.5;
}
}
}
Esto es lo que tengo.
Error que estoy recibiendo:
1> main.obj: error LNK2001: símbolo externo no resuelto "double (* LIST1) [100]" (? LIST1 @@ 3PAY0GE @ NA)
Una declaración de variable en el ámbito del espacio de nombres es siempre una definición, a menos que usted la coloque extern
; entonces es sólo una declaración.
Una regla importante en C ++ es que no puede tener varias definiciones de objetos con el mismo nombre. Si su archivo de encabezado solo contiene double LIST1[100][100];
, esto funcionaría siempre y cuando solo lo incluyas en una unidad de traducción. Pero tan pronto como incluya el archivo de encabezado en varias unidades de traducción, tendrá múltiples definiciones de LIST1
. ¡Has roto la regla!
Por lo tanto, para tener acceso a una variable global desde múltiples unidades de traducción, debe asegurarse de que solo haya una declaración en el archivo de encabezado. Hacemos esto con extern
:
extern double LIST1[100][100];
Sin embargo, no puede simplemente incluir el encabezado e intentar usar este objeto porque todavía no hay una definición. Esta declaración LIST1
simplemente dice que existe una matriz de este tipo en algún lugar, pero en realidad necesitamos definirla para crear el objeto. Entonces, en una sola unidad de traducción (uno de tus archivos .cpp
generalmente), necesitarás poner:
double LIST1[100][100];
Ahora, cada uno de sus archivos .cpp
puede incluir el archivo de encabezado y solo obtener la declaración. Está perfectamente bien tener múltiples declaraciones en tu programa. Solo uno de tus archivos .cpp
tendrá esta definición.