Pregunta

Son 'redundante incluir guardias' necesaria en CodeGear RAD Studio 2009? Es el compilador lo suficientemente inteligente como para hacer frente a esto por sí mismo?

Por ejemplo, podría tener el siguiente 'incluyen la guardia' en foo.h:

#ifndef fooH
#define fooH
// ... declaration here
#endif

y la siguiente 'redundante incluye guardia' en use_foo.h:

#ifndef fooH
    #include "foo.h"
#endif

Además, si el compilador no es lo suficientemente inteligente, son "redundantes incluyen guardias necesarry si están siendo incluidos en un archivo de origen. p.ej. use_foo.cpp. ?

¿Fue útil?

Solución

La parte del código que marca como "redundante incluyen guardia" no es necesario, pero es un posible optimización.

En el caso de C ++ Builder, hay una lógica para detectar guardias de cabecera, por lo que no debería ser necesario.

En el caso general, el paso de procesamiento previo es por lo general bastante rápido de todos modos, por lo que es poco probable que este Optimización compraría usted mucho de todos modos.

Otros consejos

Estos redundante incluye guardias pretenden emular la funcionalidad de la directiva #pragma once propuesta: si algún archivo de cabecera ya se ha incluido, a continuación, el preprocesador ni siquiera intentar localizar, abierto y analizarlo más (ya que tendría que con el "ordinario" incluyen la técnica de guardia). En muchos casos, esto hace que el manejo de incluir archivos mucho más eficientes (acelera la compilación).

Este enfoque es, obviamente, un alto mantenimiento uno: uno tiene que asegurarse de que la ortografía del símbolo de guarda es exactamente la misma en el interior del archivo de cabecera, así como fuera

.

El "redundante incluir guardia", como usted lo llama, acelera la compilación.

Sin la guardia redundante, el compilador se repetirá todo el archivo foo.h, en busca de algo de código que podría estar fuera del bloque #ifndef. Si se trata de un archivo de largo, y esto se hace muchos lugares, el compilador podría perder mucho tiempo. Pero con el guardia redundante, se puede omitir la declaración completa #include y ni siquiera a abrir ese archivo.

Por supuesto, tendría que experimentar y ver la cantidad real de tiempo perdido por el compilador iteración a través de foo.h y en realidad no compilar nada; y tal vez los compiladores modernos en realidad buscan este patrón y automáticamente no saben a molestó en abrir el archivo en absoluto, no sé.

(Comienza la edición por 280Z28)

La estructura de cabecera siguiente es reconocido por al menos GCC y MSVC. El uso de este patrón niega prácticamente todos los beneficios que podría obtener con los protectores en los archivos incluidos. Tenga en cuenta que los comentarios se ignoran cuando el compilador examina la estructura.

// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED

// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#   pragma once
#endif

// header text goes here.

#endif

(Fin de edición)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top