18

刚在里面看到这个<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一次吗?

4

5 回答 5

21

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

如果不这样做,则每次#pragma once需要时都会打开该文件,如果已定义,编译器将停止对其进行解析。#ifndef BOOST_ASIO_HPP

于 2010-08-13T10:02:34.743 回答
0

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

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

头后卫的目的

于 2010-08-13T09:59:25.280 回答
0

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

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

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

于 2010-08-13T10:16:04.890 回答
0

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

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

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

于 2010-08-13T10:23:14.253 回答