¿Por qué se utilizan #ifndef y #define en archivos de encabezado de C++?
He estado viendo código como este normalmente al inicio de los archivos de encabezado:
#ifndef HEADERFILE_H
#define HEADERFILE_H
Y al final del archivo está
#endif
¿Cuál es el propósito de esto?
Esos se llaman #incluyen guardias .
Una vez incluido el encabezado, verifica si HEADERFILE_H
se define un valor único (en este caso). Luego, si no está definido, lo define y continúa con el resto de la página.
Cuando se vuelve a incluir el código, el primero ifndef
falla, lo que genera un archivo en blanco.
Eso evita la doble declaración de cualquier identificador, como tipos, enumeraciones y variables estáticas.
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif
#ifndef
comprueba si el token dado ha estado #defined
anteriormente en el archivo o en un archivo incluido; si no, incluye el código entre este y el cierre #else
o, si no #else
está presente, #endif
la declaración. #ifndef
se usa a menudo para hacer que los archivos de encabezado sean idempotentes definiendo un token una vez que se ha incluido el archivo y verificando que el token no se haya establecido en la parte superior de ese archivo.
#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif
Esto evita la inclusión múltiple del mismo archivo de encabezado varias veces.
#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif
Suponga que ha incluido este archivo de encabezado en varios archivos. Entonces, la primera vez que __COMMON_H__ no esté definido, se definirá y se incluirá el archivo de encabezado.
La próxima vez que se defina __COMMON_H__, no se volverá a incluir.
Se llaman ifdef o incluyen guardias.
Si escribe un programa pequeño, puede parecer que no es necesario, pero a medida que el proyecto crece, puede incluir intencionalmente o no un archivo muchas veces, lo que puede resultar en una advertencia de compilación como una variable ya declarada.
#ifndef
comprueba siHEADERFILE_H
no está declarado.#define
declararáHEADERFILE_H
una vez#ifndef
que genere verdadero.#endif
es conocer el alcance de, es decir,#ifndef
el final de#ifndef
.
Si no se declara, lo que significa #ifndef
que genera verdadero, entonces solo se ejecuta la parte entre #ifndef
y ; de lo contrario, no. #endif
Esto evitará que se vuelvan a declarar los identificadores, enumeraciones, estructura, etc...