3.6. Especificar la ubicación del espacio de almacenamiento

Al crear una variable, hay varias alternativas para especificar la vida de dicha variable, la forma en que se decide la ubicación para esa variable y cómo la tratará el compilador.

3.6.1. Variables globales

Las variables globales se definen fuera de todos los cuerpos de las funciones y están disponibles para todo el programa (incluso el código de otros ficheros). Las variables globales no están afectadas por ámbitos y están siempre disponibles (es decir, la vida de una variable global dura hasta la finalización del programa). Si la existencia de una variable global en un fichero se declara usando la palabra reservada extern en otro fichero, la información está disponible para su utilización en el segundo fichero. A continuación, un ejemplo del uso de variables globales:

//: C03:Global.cpp
//{L} Global2
// Demonstration of global variables
#include <iostream>
using namespace std;

int globe;
void func();
int main() {
  globe = 12;
  cout << globe << endl;
  func(); // Modifies globe
  cout << globe << endl;
} ///:~

Listado 3.23. C03/Global.cpp


Y el fichero que accede a globe como un extern:

//: C03:Global2.cpp {O}
// Accessing external global variables
extern int globe;  
// (The linker resolves the reference)
void func() {
  globe = 47;
} ///:~

Listado 3.24. C03/Global2.cpp


El espacio para la variable globe se crea mediante la definición en Global.cpp, y esa misma variable es accedida por el código de Global2.cpp. Ya que el código de Global2.cpp se compila separado del código de Global.cpp, se debe informar al compilador de que la variable existe en otro sitio mediante la declaración

extern int globe;

Cuando ejecute el programa, observará que la llamada fun() afecta efectivamente a la única instancia global de globe.

En Global.cpp, se puede ver el comentario con una marca especial (que es diseño mío):

//{L} Global2

Eso indica que para crear el programa final, el fichero objeto con el nombre Global2 debe estar enlazado (no hay extensión ya que los nombres de las extensiones de los ficheros objeto difieren de un sistema a otro). En Global2.cpp, la primera línea tiene otra marca especial {O}, que significa «No intentar crear un ejecutable de este fichero, se compila para que pueda enlazarse con otro fichero». El programa ExtractCode.cpp en el Volumen 2 de este libro (que se puede descargar de www.BruceEckel.com) lee estas marcas y crea el makefile apropiado de modo que todo se compila correctamente (aprenderá sobre makefiles al final de este capítulo).