Какова причина того, что #pragma однажды попала в охрану заголовка? - PullRequest
18 голосов
/ 13 августа 2010

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

Ответы [ 5 ]

21 голосов
/ 13 августа 2010

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

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

0 голосов
/ 13 августа 2010

Вы можете воспроизвести эффект #pragma once стандартным способом, используя следующее:

#if !defined GUARD_SYMBOL
#include "GUARDED_FILE"
#endif

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

0 голосов
/ 13 августа 2010

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

// somerandomfileinmyproject.cpp
#undef BOOST_ASIO_HPP 
#include <bost/asio.cpp>

Если компилятор не обрабатывает такие случаи правильно, ему все равно нужно открыть файл и пропустить его через препроцессор, даже если он был включен ранее.

0 голосов
/ 13 августа 2010

Да, защита заголовка обеспечивает включение содержимого заголовка только один раз. но здесь вы используете #pragma для проверки другого определения, а не для включения файла.

Ниже приведена ссылка на существующий вопрос о защите заголовка в SO.

Назначение ограждения заголовка

...