c++ - son - texto en html ejemplo
¿Cuál es la razón para#pragma una vez dentro de los guardias de cabecera? (5)
Puede reproducir el efecto de #pragma once
de manera estándar usando lo siguiente:
#if !defined GUARD_SYMBOL
#include "GUARDED_FILE"
#endif
Aunque es mucho más verboso. Como han dicho otros, ayuda con los tiempos de compilación, ya que el archivo no se busca / abre en lugar de abrir el archivo e ignorar todo lo que contiene, ya que el preprocesador aún tiene que analizarlo.
Acabo de ver esto dentro <boost/asio.hpp>
#ifndef BOOST_ASIO_HPP
#define BOOST_ASIO_HPP
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
/// ....
#endif // BOOST_ASIO_HPP
Sin _MSC_VER
cuenta las _MSC_VER
preprocesador _MSC_VER
, ¿cuál es el beneficio de tener el #pragma once
en este caso? ¿No se asegura la protección del encabezado del preprocesador en todos los casos y en todas las plataformas, el contenido del encabezado solo se included
una vez?
Sí, los protectores de encabezado garantizan que el contenido del encabezado se incluya solo una vez. pero aquí está utilizando #pragma para verificar otra definición y no incluir el archivo.
El siguiente enlace es una pregunta existente sobre los guardias de cabecera en SO.
#pragma once
especifica que el compilador incluirá (abrirá) el archivo solo una vez cuando compile un archivo de código fuente. Esto puede reducir los tiempos de compilación ya que el compilador no se abrirá y leerá el archivo después del primer #include
del módulo.
Si no #pragma once
, el archivo se abrirá cada vez que sea necesario y el compilador dejará de analizarlo en #ifndef BOOST_ASIO_HPP
, si se ha definido.
#pragma once
tiene el mismo propósito, pero las guardas de inclusión están destinadas a requerir un análisis más profundo para garantizar que un archivo se incluya exactamente una vez, por ejemplo
// somerandomfileinmyproject.cpp
#undef BOOST_ASIO_HPP
#include <bost/asio.cpp>
A menos que el compilador maneje tales casos correctamente, todavía necesita abrir el archivo y pasarlo a través del preprocesador aunque ya se haya incluido anteriormente.