C ++包括标准标题的保护

时间:2013-11-02 03:37:17

标签: c++ include-guards

我想知道/ windows.hmath.hiostreamstdio等文件是否包含警卫/

因为我在不同的文件中多次包含这些标题。这些文件是否内置了防护装置或是否定义了定义?

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

4 个答案:

答案 0 :(得分:11)

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

ISO / IEC 14822:2011

  

17.6.2.2标题[using.headers]

     

¶2翻译单位可以包括任何顺序的图书馆标题(第2条)。每个可以被包含多次,除了包含<cassert><assert.h>的效果每次都取决于NDEBUG的词汇当前定义之外,没有任何效果与仅被包含一次有效 178

     

178 这与标准C库相同。

答案 1 :(得分:10)

伙计,你是非常懒惰的,只需打开文件(你甚至可以在大多数编辑器中右键单击include指令),它的开头是:

#ifndef _WINDOWS_
#define _WINDOWS_
...

因此,第一次它将进入文件,因为_WINDOWS_未定义,因此将定义它并将包含该文件的内容。第二次#ifndef将失败,因为之前已完成定义。

这是设置保护措施的标准方法,许多编译器支持的另一种方法是放置#pragma once。这有利于在有人在另一个文件中定义相同常量的情况下防止冲突。

答案 2 :(得分:3)

许多编译器都支持#pragma once。所有标准库都有#pragma once形式的保护或适当的预处理器宏。您可以在the Wikipedia page上详细了解警卫的样子。最快的方法是右键单击包含文件定义并要求开发环境(Visual Studio / Eclipse)打开该文件。然后你会看到守卫。

答案 3 :(得分: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

...