为什么同时使用#pragma并包含后卫?

时间:2018-04-29 19:17:30

标签: c++ boost c-preprocessor

我正在研究boost库,对我来说很奇怪的是很多库都使用这种代码:

#ifndef BOOST_SERIALIZATION_ACCESS_HPP
#define BOOST_SERIALIZATION_ACCESS_HPP

// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif

MSDN明确声明:

  

使用#include后卫成语和    #pragma曾在同一个文件中

我无法理解原因是什么。包括后卫在内还能完成这项工作所以我们为什么还要费心写一下pragma呢?

1 个答案:

答案 0 :(得分:5)

实际上编译器内部可能存在细微差别。当编译器遇到#pragma once时,它可以在内部标记包含此文件。当它第二次遇到#include这个文件时,即使打开它也不会打扰它,它只会忽略#include语句。

只有包含guard,预处理器必须在每次包含整个文件时解析整个文件以找到匹配的#endif。理论上,如果多次包含真正复杂的大型包含文件,则会影响编译时间。

除此之外,包括后卫和#pragma once的行为方式相同。通常使用它们,因为并不保证所有编译器都支持#pragma once

修改

编译器可能能够检测到包含Guard的语句围绕整个文件的代码,并推断它是一个包含保护,产生与#pragma once完全相同的行为。如果是这样,那么MSDN的说法是正确的。