7

我想知道是否/什么包括对文件的保护,如windows.h, math.h, iostream, stdio... 等。

因为我在不同的文件中多次包含这些标题。这些文件是否已经内置了保护程序或者是否定义了定义?

我只是想知道这种事情的标准是什么。

4

4 回答 4

13

C++ 标准要求对标头进行组织,以便您可以直接或间接地多次包含其中的任何一个,而不会遇到问题。它没有规定如何实现这一结果,只是规定了它应该实现。

ISO/IEC 14822:2011

17.6.2.2 标头 [using.headers]

¶2 翻译单元可以以任何顺序包含库标题(第 2 条)。每个都可以被包含多次,与只包含一次没有任何不同的效果,除了每次包含<cassert>或的效果<assert.h>取决于 的词汇当前定义NDEBUG178

178这与标准 C 库相同。

于 2013-11-02T03:49:11.583 回答
11

如果您打开文件来读取内容(您甚至可以在大多数编辑器中右键单击包含指令来打开文件),您会看到包含文件通常以以下内容开头:

#ifndef _WINDOWS_
#define _WINDOWS_
...

所以第一次它会进入文件,因为_WINDOWS_没有定义,因此它将被定义并且文件的内容将被包含在内。#ifndef由于先前已完成定义,第二次将失败。

这是放置安全措施的标准方法,许多编译器支持的另一种方法是放置#pragma once. 例如,如果有人在另一个文件中定义相同的常量,这有利于防止冲突。

于 2013-11-02T03:46:06.290 回答
3

许多编译器支持#pragma once. 所有的标准库都已经具有以#pragma once或适当的预处理器宏的形式提供的保护。您可以在 Wikipedia 页面上了解有关守卫外观的更多信息。确定的最快方法是右键单击包含文件定义并要求开发环境(Visual Studio/Eclipse)打开该文件。然后你会看到守卫。

于 2013-11-02T03:47:21.050 回答
1

这些文件位于/usr/include/子目录中(至少在我的 debian 笔记本电脑上)。看着/usr/include/stdio.h

显示了一个典型的后卫,

#ifndef _STDIO_H
# define _STDIO_H       1

并检查 cpp, grep __cplusplus,

#if !defined __cplusplus || defined __STDC_LIMIT_MACROS

...

于 2013-11-02T03:45:00.557 回答