在同一个头文件中包含 guard 和 #pragma once

2021-12-24 00:00:00 c++ boost

引自 Microsoft 文档,没有在同一文件中同时使用 #include 守卫习惯用法和 #pragma once 的优势.

之前关于 stackoverflow 的相关问题的答案也证实了两者兼而有之是毫无意义的.例如,见下文:

Answers to previous related questions on stackoverflow also confirm that it is pointless to have both. See below, for instance:

标题守卫和编译指示一次

boost 库的 vector.hpp 文件是这样开始的:

The boost library's vector.hpp file, however, starts thus:

#ifndef BOOST_ASSIGN_STD_VECTOR_HPP
#define BOOST_ASSIGN_STD_VECTOR_HPP

#if defined(_MSC_VER)
# pragma once
#endif
...
#endif

也就是说,它既包括守卫习语也包括 pragma once.有什么原因为什么boost头文件有两个?

That is, it includes both the guard idiom as well as the pragma once. Is there any reason why boost header files have both?

推荐答案

从技术上讲#pragma once 不是标准的 C++,而标头保护是.如果两者兼而有之,它们就不会相互冲突.

Technically #pragma once is not standard C++, whereas header guards are. They will not conflict with each other if you have both.

boost 可能兼具两者的原因,正如 #if defined(_MSC_VER) 所暗示的那样,如果你不使用 MSVC,那么你需要一些东西来采取行动作为你的头球后卫,所以他们回到另一种方法.

The reason boost likely has both, as alluded to by the #if defined(_MSC_VER) is that if you're not using MSVC then you need something to act as your header guard, so they fall back to the other method.

由于 boost 力求跨平台,他们试图确保他们的代码在不支持 #pragma once 的编译器上工作,尽管我能想到的所有大型现代编译器都支持它,如在维基百科中列举.

Since boost strives to be cross-platform they are trying to ensure their code works on compilers that don't support #pragma once, though all of the big modern compilers I can think of do support it, as enumerated on wikipedia.

相关文章