我想知道是否/什么包括对文件的保护,如windows.h
, math.h
, iostream
, stdio
... 等。
因为我在不同的文件中多次包含这些标题。这些文件是否已经内置了保护程序或者是否定义了定义?
我只是想知道这种事情的标准是什么。
我想知道是否/什么包括对文件的保护,如windows.h
, math.h
, iostream
, stdio
... 等。
因为我在不同的文件中多次包含这些标题。这些文件是否已经内置了保护程序或者是否定义了定义?
我只是想知道这种事情的标准是什么。
C++ 标准要求对标头进行组织,以便您可以直接或间接地多次包含其中的任何一个,而不会遇到问题。它没有规定如何实现这一结果,只是规定了它应该实现。
17.6.2.2 标头 [using.headers]
¶2 翻译单元可以以任何顺序包含库标题(第 2 条)。每个都可以被包含多次,与只包含一次没有任何不同的效果,除了每次包含
<cassert>
或的效果<assert.h>
取决于 的词汇当前定义NDEBUG
。178178这与标准 C 库相同。
如果您打开文件来读取内容(您甚至可以在大多数编辑器中右键单击包含指令来打开文件),您会看到包含文件通常以以下内容开头:
#ifndef _WINDOWS_
#define _WINDOWS_
...
所以第一次它会进入文件,因为_WINDOWS_
没有定义,因此它将被定义并且文件的内容将被包含在内。#ifndef
由于先前已完成定义,第二次将失败。
这是放置安全措施的标准方法,许多编译器支持的另一种方法是放置#pragma once
. 例如,如果有人在另一个文件中定义相同的常量,这有利于防止冲突。
许多编译器支持#pragma once
. 所有的标准库都已经具有以#pragma once
或适当的预处理器宏的形式提供的保护。您可以在 Wikipedia 页面上了解有关守卫外观的更多信息。确定的最快方法是右键单击包含文件定义并要求开发环境(Visual Studio/Eclipse)打开该文件。然后你会看到守卫。
这些文件位于/usr/include/
子目录中(至少在我的 debian 笔记本电脑上)。看着/usr/include/stdio.h
显示了一个典型的后卫,
#ifndef _STDIO_H
# define _STDIO_H 1
并检查 cpp, grep __cplusplus
,
#if !defined __cplusplus || defined __STDC_LIMIT_MACROS
...