6

我希望这个网站以前没有被问过。我无法从谷歌找到可靠的答案。

当您在项目的多个文件中#include iostream 时会发生什么?我总是在我的头文件中使用#ifndef 和#define。这是否会阻止 iostream 被多次包含?

4

4 回答 4

5

我对这个问题有两种解释:

  1. 您可以iostream在同一个编译单元中包含多次吗?
    • 是的,安全。所有标准标头都包含防护装置,因此可以安全地使用。
  2. 在你的代码中使用包含保护会防止iostream被多次包含吗?
    • 当然,它也会阻止编译器不止一次地看到介于#ifndefand之间的所有内容#endif(或在标有 的标头中,在支持它的编译器中)......这正是包含警卫所做的,对吧?#pragma once但这并不是真正需要的#include <iostream>,因为它已经防止了多个包含。
于 2013-04-14T01:52:15.413 回答
3

就像 chris 和 Haroogan 说的,是的,他们会阻止这种情况发生。#ifndef 和 #define 是预处理器指令,用英文翻译成

#ifndef(如果未定义)

#define(定义)

因此,如果您创建一个标头,并 #include "myheader.h" 两次,那么该文件将不会被再次包含,因为您将它包含在一个 if 语句中,这将导致该文件仅在它有时被包含(和定义)尚未包括(定义)。

于 2013-04-14T01:31:49.623 回答
0

不管。即使您使用ifndef. 因为多个文件将被包含一次。并且所有尝试包括<iostream>但如果你打开<iostream>它有

#pragma once

这基本上意味着它只会被包含一次。这不是避免我在行业中发现的多个包含的建议方法。因为更难知道它不会再次被包含在内。与在顶部和底部看到 ifndef 相比。

于 2013-04-14T01:29:35.543 回答
0
#ifndef __IOSTREAM_H
#include <iostream>
#endif

...

似乎大多数标准标头都有一种如上所述的包含保护。

或者,您可以通过定义所需的宏来制作自己的包含防护。

于 2015-10-25T09:47:39.117 回答