В чем причина #pragma один раз в заголовках?
-
28-09-2019 - |
Вопрос
Только что видел это внутри <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
однажды?
Решение
#pragma once
Указывает, что файл будет включен (открыт) только один раз компилятором при компиляции файла исходного кода. Это может уменьшить время сборки, так как компилятор не откроется и прочитал файл после первого #include
модуля.
Если вы этого не сделаете #pragma once
, файл будет открыл каждый раз Нужно, и компилятор перестанет распределять его на #ifndef BOOST_ASIO_HPP
, если это было определено.
Другие советы
Да заголовки Guard гарантируют, что содержимое заголовка включено только один раз. Но здесь вы используете #Pragma для проверки другого определения и не включать файл.
Ниже приведена ссылка существующая вопрос на заголовках в так же.
#pragma once
Имеет ту же цель, но включает охранников предназначены для требуния более глубокого анализа, чтобы убедиться, что файл входит именно один раз - например,
// somerandomfileinmyproject.cpp
#undef BOOST_ASIO_HPP
#include <bost/asio.cpp>
Если компилятор правильно не обрабатывает такие случаи, он все еще должен открывать файл и передавать его через препроцессор, даже если он был включен ранее.
Вы можете воспроизвести эффект #pragma once
Стандартным способом, используя следующее:
#if !defined GUARD_SYMBOL
#include "GUARDED_FILE"
#endif
Хотя это гораздо более многословным. Поскольку другие сказали, это помогает с времен компиляции, поскольку файл не искал / открывается вместо того, чтобы открыть файл и игнорировать все внутри него - файл все еще должен быть проанализирован препроцессором.