En los lenguajes de programación C y C++ , #include guards ( protección de conexión ), a veces también llamado macro guard , es una construcción especial que se usa para evitar problemas de "doble cableado" cuando se usa una directiva de compilación #include . Agregar protecciones #include a un archivo de encabezado es una forma de hacer que el archivo sea idempotente , lo que significa que múltiples inclusiones equivalen a una y no generan errores.
El siguiente fragmento de código C demuestra los posibles problemas que pueden surgir si se omiten las protecciones #include:
archivo abuelo.h estructura foo { miembro int ; }; padre.h archivo #include "abuelo.h" archivo child.c #include "abuelo.h" #include "padre.h"Aquí, dos copias del archivo de encabezado "abuelo.h" están directamente conectadas al archivo "niño.c" . Esto puede provocar un error de compilación porque la estructura de tipo se foodefine explícitamente dos veces.
En este ejemplo, la primera inclusión del archivo "abuelo.h" hace que se H_GRANDFATHER defina el identificador de la macro. Además, cuando "grandfather.h" se incluye en "child.c" por segunda vez, la verificación de la directiva para un identificador indefinido #ifndeffalla y el preprocesador omite todo hasta la directiva #endif, evitando así la segunda definición struct foo. Como resultado, el programa compila correctamente.
Para que los protectores #include funcionen correctamente, cada uno de ellos debe usar (verificar y definir) su propio identificador de macro de preprocesador único. Por lo tanto, en un proyecto que utilice #include guards, se debe observar un único sistema de nombres para los identificadores de macros y todos los identificadores utilizados no deben superponerse (coincidir) entre sí, o con identificadores de archivos de encabezado de terceros utilizados en el proyecto e identificadores de macros. con visibilidad mundial.
Para resolver estos problemas, la mayoría de las implementaciones de C y C++ admiten la directiva no estándar #pragma once. Insertada al principio de un archivo de encabezado, esta directiva limitará el número de conexiones para este archivo a una. Este enfoque, sin embargo, tiene la desventaja de dificultar potencialmente la detección cuando dos directivas #includecon diferentes opciones realmente se refieren al mismo archivo de encabezado (por ejemplo, usando un enlace simbólico en sistemas similares a Unix). Además, dado que #pragma onceno es una directiva estándar, su semántica puede variar mucho según la aplicación.