4.7.4. Un estándar para los ficheros de cabecera

En cada fichero de cabecera que contiene una estructura, primero debería comprobar si ese fichero ya ha sido includo en este fichero cpp particular. Hágalo comprobando una bandera del preprocesador. Si la bandera no está definida, el fichero no se ha incluido aún, y se debería definir la bandera (de modo que la estructura no se pueda redeclarar) y declarar la estructura. Si la bandera estaba definida entonces el tipo ya ha sido declarado de modo que debería ignorar el código que la declara. Así es como debería ser un fichero de cabecera:

#ifndef HEADER_FLAG
    #define HEADER_FLAG
    // Escriba la declaración aquí...
    #endif // HEADER_FLAG

Como puede ver, la primera vez que se incluye el fichero de cabecera, los contenidos del fichero (incluyendo la declaración del tipo) son incluidos por el preprocesador. Las demás veces que se incluya -en una única unidad de programación- la declaración del tipo será ignorada. El nombre HEADER_FLAG puede ser cualquier nombre único, pero un estándar fiable a seguir es poner el nombre del fichero de cabecera en mayúsculas y reemplazar los puntos por guiones bajos (sin embargo, el guión bajo al comienzo está reservado para nombres del sistema). Este es un ejemplo:

//: C04:Simple.h
// Simple header that prevents re-definition
#ifndef SIMPLE_H
#define SIMPLE_H

struct Simple {
  int i,j,k;
  initialize() { i = j = k = 0; }
};
#endif // SIMPLE_H ///:~

Listado 4.8. C04/Simple.h


Aunque el SIMPLE_H después de #endif está comentado y es ignorado por el preprocesador, es útil para documentación.

Estas sentencias del preprocesador que impiden inclusiones múltiples se denominan a menudo guardas de inclusión (include guards)