我正在研究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呢?
答案 0 :(得分:5)
实际上编译器内部可能存在细微差别。当编译器遇到#pragma once
时,它可以在内部标记包含此文件。当它第二次遇到#include
这个文件时,即使打开它也不会打扰它,它只会忽略#include
语句。
只有包含guard,预处理器必须在每次包含整个文件时解析整个文件以找到匹配的#endif
。理论上,如果多次包含真正复杂的大型包含文件,则会影响编译时间。
除此之外,包括后卫和#pragma once
的行为方式相同。通常使用它们,因为并不保证所有编译器都支持#pragma once
。
修改强>
编译器可能能够检测到包含Guard的语句围绕整个文件的代码,并推断它是一个包含保护,产生与#pragma once
完全相同的行为。如果是这样,那么MSDN的说法是正确的。