Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在同一头文件中包含一次guard和#pragma_C++_Boost - Fatal编程技术网

C++ 在同一头文件中包含一次guard和#pragma

C++ 在同一头文件中包含一次guard和#pragma,c++,boost,C++,Boost,引用,在同一个文件中同时使用#include-guard成语和#pragma并没有任何好处。 对stackoverflow之前相关问题的回答也证实了两者都有是毫无意义的。例如,见下文: 然而,boost库的vector.hpp文件是这样启动的: #ifndef BOOST_ASSIGN_STD_VECTOR_HPP #define BOOST_ASSIGN_STD_VECTOR_HPP #if defined(_MSC_VER) # pragma once #endif ... #endif

引用,
在同一个文件中同时使用#include-guard成语和#pragma并没有任何好处。

对stackoverflow之前相关问题的回答也证实了两者都有是毫无意义的。例如,见下文:

然而,
boost
库的
vector.hpp
文件是这样启动的:

#ifndef BOOST_ASSIGN_STD_VECTOR_HPP
#define BOOST_ASSIGN_STD_VECTOR_HPP

#if defined(_MSC_VER)
# pragma once
#endif
...
#endif
也就是说,它既包括警卫成语,也包括布拉格一次。Boost头文件是否有任何原因,即

< P>技术上> C++ > TracePracMA曾经不是标准C++,而头保护是。如果两者都有,它们就不会相互冲突

正如
#if defined(\u MSC\u VER)
所暗示的,boost可能同时具有这两种功能的原因是,如果您不使用MSVC,那么您需要一些东西来充当头部防护,因此它们会退回到另一种方法


由于boost致力于跨平台,他们正试图确保他们的代码在不支持
#pragma once
的编译器上运行,尽管我能想到的所有大型现代编译器都支持它,因为它是一种优化,#pragma once速度更快,因为预处理器可以跳过整个文件。include守卫要求它继续解析以查找#endif。因此,这仍然是合理的,尽管节省的时间不会太多。@HansPassant,因为在上面的vector.hpp文件中,一旦在include-guard中遇到pragma,在遇到endif之前,解析不一定要进行吗?也就是说,pragma一次不应该出现在include-guard之前吗?@Tryer这可能没关系,因为只要MS编译器看到
#pragma-once
,整个wile都会被跳过。由于include-header-guard更通用,而且放在第一位,我不清楚为什么会有更具体的内容(pragma-once)应该遵循它。@Tryer-谁说有优势?Boost vector.hpp从2005年开始拥有版权,届时可能支持20世纪末的编译器。现在微软说这没有什么优势,但可能早就有了,而且保持这种优势不会造成太大的损害。