Вопрос

Только что видел это внутри <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

Хотя это гораздо более многословным. Поскольку другие сказали, это помогает с времен компиляции, поскольку файл не искал / открывается вместо того, чтобы открыть файл и игнорировать все внутри него - файл все еще должен быть проанализирован препроцессором.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top