在同一文件中使用#pragma once和#ifndef include guard < >我在C++标准库(例如:ISTRAMAM)的一些头文件中看到,Suff-PracMA曾经和 > IFNDEF/OY]定义包含保护。 我正在使用MS Visual Studio 2010 Express

在同一文件中使用#pragma once和#ifndef include guard < >我在C++标准库(例如:ISTRAMAM)的一些头文件中看到,Suff-PracMA曾经和 > IFNDEF/OY]定义包含保护。 我正在使用MS Visual Studio 2010 Express,c++,C++,例如: #pragma once #ifndef _ISTREAM_ #define _ISTREAM_ . . . 为什么两者都使用?这可能是为了交叉兼容性。Pragma曾经得到广泛支持,但不一定是标准的一部分 看看: 如果支持“pragma one”,则会加快编译速度,因为编译器只包含文件一次#ifndef仍然会再次包含该文件,但预处理器会删除中间的所有文本(因为#define在前面已经计算过了,因此被定义) 有一个关于它的讨论请记住,标准库是为特定的编译器编写的。它可以做一些不可移植的事

例如:

#pragma once
#ifndef _ISTREAM_
#define _ISTREAM_
.
.
.

为什么两者都使用?

这可能是为了交叉兼容性。Pragma曾经得到广泛支持,但不一定是标准的一部分

看看:

如果支持“pragma one”,则会加快编译速度,因为编译器只包含文件一次#ifndef仍然会再次包含该文件,但预处理器会删除中间的所有文本(因为#define在前面已经计算过了,因此被定义)


有一个关于它的讨论

请记住,标准库是为特定的编译器编写的。它可以做一些不可移植的事情。事实上,将东西放入标准库的原因之一是它们无法可移植地实现(例如,
offsetof
)。不要把标准库作为编写代码的范例。(另一个例子是include guard:name
\u ISTREAM\u
保留供实现使用)您可能会丢失“必然”。如果它是标准的一部分,它将是
#once