我想知道/ windows.h
,math.h
,iostream
,stdio
等文件是否包含警卫/
因为我在不同的文件中多次包含这些标题。这些文件是否内置了防护装置或是否定义了定义?
我只是想知道这种标准的标准是什么。
答案 0 :(得分:11)
C ++标准要求对标题进行组织,以便您可以直接或间接地多次包含其中任何一个,而不会遇到问题。它没有强制要求如何实现这一结果,只是要实现它。
17.6.2.2标题[using.headers]
¶2翻译单位可以包括任何顺序的图书馆标题(第2条)。每个可以被包含多次,除了包含
<cassert>
或<assert.h>
的效果每次都取决于NDEBUG
的词汇当前定义之外,没有任何效果与仅被包含一次有效 178178 这与标准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
...