在同一个文件中同时使用 #pragma once 和 #ifndef include guard

4

我在一些C++标准库的头文件中看到了两种包含保护方式,分别是#pragma once#ifndef/#define。我正在使用MS Visual Studio 2010 Express。

例如:

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

为什么两者都被使用?

2
请记住,标准库是为特定编译器编写的。它可以做一些不可移植的事情。实际上,将某些内容放入标准库的原因之一是它们无法以可移植的方式实现(例如 offsetof)。不要将标准库视为编写代码的典范。(另一个例子是包含保护:名称 _ISTREAM_ 保留供实现使用) - Pete Becker
2个回答

3
如果支持 #pragma once,那么编译时间会更快,因为编译器只会将文件包含一次。而 #ifndef 仍然会再次包含文件,但是预处理器会删除中间的所有文本(因为先前已经评估了 #define 并定义了它)。 这里有一个讨论:#pragma once versus #ifndef

0

这很可能是为了跨平台兼容性。Pragma once 得到广泛支持,但并不一定是标准的一部分。

可以看看: #pragma once vs include guards?


你可以去掉“必要的”这个词。如果它是标准的一部分,那么应该是 #once - user4581301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接