刚看到<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
一次吗?
答案 0 :(得分:21)
#pragma once
指定在编译源代码文件时编译器将仅包含(打开) 文件。这可以减少构建时间,因为编译器在模块的第一个#include
之后不会打开和读取文件。
如果你没有#pragma once
,那么每次需要打开文件,如果已经定义,编译器将停止在#ifndef BOOST_ASIO_HPP
上解析它。
答案 1 :(得分:3)
来自 SO
的另一个相关问题答案 2 :(得分:0)
答案 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
虽然它更冗长。正如其他人所说,它有助于编译时间,因为不搜索/打开文件而不是打开文件并忽略其中的所有内容 - 文件仍然必须由预处理器解析。