Esto resulta útil cuando tiene variables globales. Usted declara la existencia de variables globales en un encabezado, de modo que cada archivo fuente que incluye el encabezado lo sepa, pero solo necesita "definirlo" una vez en uno de sus archivos fuente.
Para aclarar, usar extern int x;
le dice al compilador que un objeto de tipo int
llamado x
existe en alguna parte . No es el trabajo de los compiladores saber dónde existe, solo necesita saber el tipo y el nombre para saber cómo usarlo. Una vez que se hayan compilado todos los archivos de origen, el vinculador resolverá todas las referencias x
a la definición que encuentra en uno de los archivos de origen compilados. Para que funcione, la definición de la x
variable debe tener lo que se llama "enlace externo", lo que básicamente significa que debe declararse fuera de una función (en lo que generalmente se llama "el alcance del archivo") y sin la static
palabra clave.
encabezamiento:
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
fuente 1:
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
fuente 2:
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
extern
en varias ocasiones. Las herramientas de Microsoft produjeron un error de enlace para los símbolos faltantes cuando solo se definieron las tablas en otro archivo fuente. El problema era que la tabla eraconst
y el compilador de C ++ lo promovióstatic
en la unidad de traducción. Ver, por ejemplo,ariatab.cpp
ykalynatab.cpp
.