#pragma曾经在头部守卫中出现的原因是什么?

时间:2010-08-13 09:56:14

标签: c++ boost c-preprocessor header-files 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一次吗?

5 个答案:

答案 0 :(得分:21)

#pragma once指定在编译源代码文件时编译器将仅包含(打开) 文件。这可以减少构建时间,因为编译器在模块的第一个#include之后不会打开和读取文件。

如果你没有#pragma once,那么每次需要打开文件,如果已经定义,编译器将停止在#ifndef BOOST_ASIO_HPP上解析它。

答案 1 :(得分:3)

答案 2 :(得分:0)

是标题保护确保标题内容仅包含一次。但是在这里你使用#pragma来检查另一个定义,而不是包含文件。

以下链接是SO中标题保护的现有问题。

Purpose of Header guards

答案 3 :(得分:0)

#pragma once具有相同的目的,但包括警卫旨在要求更深入的分析,以确保文件只包含一次 - 例如。

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

除非编译器确实正确处理了这种情况,否则它仍然需要打开文件并将其传递给预处理器,即使之前已经包含它。

答案 4 :(得分:0)

您可以使用以下方法以标准方式重现#pragma once的效果:

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

虽然它更冗长。正如其他人所说,它有助于编译时间,因为不搜索/打开文件而不是打开文件并忽略其中的所有内容 - 文件仍然必须由预处理器解析。