2010-01-10 18 views

Respuesta

14

Es un llamado "incluir guardia". El objetivo es evitar que el archivo tenga que analizarse varias veces si se incluye varias veces.

+0

Y para evitar múltiples definiciones de la misma clase. – James

+1

¿Alguna vez hubo una directiva #import, o es solo mi imaginación? –

+2

@Autopulated: Eso es lo que quiere decir al analizar varias veces. Hay más cosas que las redefiniciones de clase de las que preocuparse; todos están encapsulados por "análisis múltiple". – GManNickG

3

Se llama protector de inclusión. Puede escribir sin ellos hasta que comience a escribir programas grandes y descubra que necesita incluir el mismo archivo .h más de una vez, directa o indirectamente, desde un archivo .c. Luego, sin incluir guardias, obtendría múltiples errores de definición, pero con ellos, los contenidos del archivo de encabezado se analizan solo una vez y se omiten todas las veces subsiguientes, evitando esos errores. Es una buena práctica usarlos siempre.

4

Impide inclusiones múltiples de un solo archivo. El mismo se puede hacer usando

#pragma once 

Directiva, pero esos son estándar #ifndefs por lo tanto el apoyo de cada compilador.

+3

#pragma una vez. Es una extensión específica del compilador. –

+0

... pero es ampliamente compatible, para ser justos –

-1

Si un archivo de encabezado contiene una definición como

int i;
que, al estar varias veces sin guardián, producirá un error de compilación.
ifndef comprueba que alguna variable de preprocesador no está definida (y no lo está, por primera vez), luego la define explícitamente para evitar ser capturada nuevamente. En MSVC también puede usar
#pragma once
en lugar de ifndef.

1

Si entiendo correctamente, desea saber si, a falta de guardias incluidas, puede incluir un archivo de encabezado varias veces causar un error o comportamiento peligroso. Esto es después de excluir múltiples definiciones, etc.

Imagine un programador malicioso, cuyo archivo de cabecera no tiene los guardias de inclusión. Su archivo de encabezado define una macro, SZ, que es un tamaño que usa para las matrices asignadas estáticamente. El programador podría escribir su archivo de cabecera de esta manera:

#ifndef SZ 
#define SZ 1024 
#else 
#if SZ == 1024 
#undef SZ 
#define SZ 128 
#else 
#error "You can include me no more than two times!" 
#endif 
#endif 

Ahora, si se incluye el archivo de cabecera una vez, se obtiene SZ igual a 1024. Si se incluye dos veces, se convierte en SZ 128. Por supuesto, la mayor parte real los programadores del mundo no son maliciosos, y nadie escribe código como el anterior.

Nota que el estándar C permite assert.h para ser #include d más de una vez con un comportamiento diferente dependiendo de si NDEBUG se define en el momento de la inclusión de assert.h. Por lo tanto, assert.h no puede haber incluido guardias. Esa es una característica, no un error, sin embargo.

Cuestiones relacionadas