Подтвердить что ты не робот

Какова причина того, что #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 один раз?

4b9b3361

Ответ 1

#pragma once указывает, что файл будет включен (открыт) только один раз компилятором при компиляции файла исходного кода. Это может сократить время сборки, поскольку компилятор не откроет и не прочитает файл после первого #include модуля.

Если вы не #pragma once, файл будет открыт каждый раз, это необходимо, и компилятор прекратит его синтаксический анализ на #ifndef BOOST_ASIO_HPP, если он был определен.

Ответ 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

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