Какова причина того, что #pragma один раз в защитниках заголовков?
Только что видел это внутри <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
Не считая проверки препроцессора _MSC_VER
, в чем преимущество #pragma once
в этом случае? Не гарантирует ли защита заголовка препроцессора во всех случаях и на всех платформах, содержимое заголовка только когда-либо included
один раз?
Ответы
Ответ 1
#pragma once
указывает, что файл будет включен (открыт) только один раз компилятором при компиляции файла исходного кода. Это может сократить время сборки, поскольку компилятор не откроет и не прочитает файл после первого #include
модуля.
Если вы не #pragma once
, файл будет открыт каждый раз, это необходимо, и компилятор прекратит его синтаксический анализ на #ifndef BOOST_ASIO_HPP
, если он был определен.
Ответ 2
Указывает, что файл будет включен (открыт) только один раз компилятором в сборке. Это может сократить время сборки, поскольку компилятор не откроет и не прочитает файл после первого #include модуля
И еще один связанный вопрос из fooobar.com/questions/21072/...
Ответ 3
Да, защита заголовков гарантирует, что содержимое заголовка будет включено только один раз. но здесь вы используете #pragma для проверки другого определения и не включаете файл.
Следующая ссылка представляет собой существующий вопрос о защите заголовков в SO.
Назначение защитников заголовков
Ответ 4
#pragma once
имеет ту же цель, но включить охранники, чтобы требовать более глубокого анализа, чтобы гарантировать, что файл включен ровно один раз - например.
// somerandomfileinmyproject.cpp
#undef BOOST_ASIO_HPP
#include <bost/asio.cpp>
Если компилятор правильно обрабатывает такие случаи, ему все равно нужно открыть файл и передать его через препроцессор, даже если он был включен ранее.
Ответ 5
Вы можете воспроизвести эффект #pragma once
стандартным способом, используя следующее:
#if !defined GUARD_SYMBOL
#include "GUARDED_FILE"
#endif
хотя он гораздо более подробный. Как говорили другие, это помогает с моментами компиляции, так как файл не ищет/не открывает, а не открывает файл и игнорирует все внутри него - файл все еще должен анализироваться препроцессором.