有C++;标准库ifdef或ifndef预处理器指令? 我正在用C++构建我自己的终端应用程序项目,我问自己标准库是否有IFDEF或IFNDEF预处理器指令。我想知道,因为我需要创建不同的头文件,这些头文件需要一些标准库头文件,例如“string”和其他一些头文件,所以我不想包含同一个库3次或更多次,因为这会使程序更重。 例如,我在头文件上写了类似这样的内容,以防止.h文件被多次包含: #ifndef myheader_h #define myheader_h // my file code here #endif

有C++;标准库ifdef或ifndef预处理器指令? 我正在用C++构建我自己的终端应用程序项目,我问自己标准库是否有IFDEF或IFNDEF预处理器指令。我想知道,因为我需要创建不同的头文件,这些头文件需要一些标准库头文件,例如“string”和其他一些头文件,所以我不想包含同一个库3次或更多次,因为这会使程序更重。 例如,我在头文件上写了类似这样的内容,以防止.h文件被多次包含: #ifndef myheader_h #define myheader_h // my file code here #endif,c++,preprocessor,standard-library,C++,Preprocessor,Standard Library,我尝试编译,但编译器没有告诉我任何错误或警告。 我还试图阅读标准库源代码(),但没有找到任何像ifdef或ifndef这样的预处理器规则。 我应该包括这样的标准库标题吗? #ifndef string_h #define string_h #include <string> #endif \ifndef字符串 #定义字符串 #包括 #恩迪夫 我希望我的问题没有被问到,因为我在搜索时没有找到它 更新 对于一些人说“你现在的处境不需要担心”,或者说“如果有合适的包含守卫,成本

我尝试编译,但编译器没有告诉我任何错误或警告。
我还试图阅读标准库源代码(),但没有找到任何像ifdef或ifndef这样的预处理器规则。
我应该包括这样的标准库标题吗?

#ifndef string_h
#define string_h
    #include <string>
#endif
\ifndef字符串
#定义字符串
#包括
#恩迪夫
我希望我的问题没有被问到,因为我在搜索时没有找到它

更新
对于一些人说“你现在的处境不需要担心”,或者说“如果有合适的包含守卫,成本很低”,我的意思是:程序的繁重很重要,我想让它变得更轻,所以我不想多次完全包含同一个文件。std lib文件是否包含防护装置?(我的头文件有它们,不知道std lib文件)

标准头文件不需要定义任何特定的预处理器符号,以确保它们可以多次包含

话虽如此,任何合理的实现都将确保它们可以多次
#include
d而不会对应用程序代码产生不利影响

事实证明,这是大多数标题的标准要求(谢谢@Rakete1111)

翻译单元可以包括任何顺序的库标题()。每个可包含多次,与仅包含一次没有不同的效果,但包含
的效果每次取决于
NDEBUG
的当前词汇定义

不仅如此,他们很可能使用
#pragma once
指令。因此,即使对同一标题多次使用
#include
,它们也只会被读取一次

总之,不要担心标准头文件。如果您的头文件实现正确,您的应用程序就可以了

我问自己[sic]标准库是否有ifdef或ifndef预处理器指令

该标准没有规定是否有
ifdef
样式的标题保护,尽管它确实要求以某种方式保护多个包含。我查看了stdlibc++标准库实现的随机头。它确实有头罩

我不想包含同一个库3次或更多次,因为这会使程序更重

多次包含头文件不会使程序“更重”

我应该包括这样的标准库标题吗

#ifndef string_h
#define string_h
    #include <string>
#endif
\ifndef字符串
#定义字符串
#包括
#恩迪夫

这不是必需的,也不是特别有用。

您所说的那些预处理器指令称为“头保护”,标准库头文件与所有其他适当的头文件一样,肯定有它们(或执行相同操作的其他机制)。多次包含它们不会导致任何问题,您只需要在编写自己的头文件时担心这些问题

您正在阅读的“源代码”只是说明头文件应该如何工作的文档,但它没有提供实际的代码。要查看代码,可以查看编译器提供的头文件。例如,Visual Studio中的
标题同时具有
#pragma once
和标题保护:

#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
//...
#endif /* _IOSTREAM_ */
GCC编译器提供的标头还具有标头保护:

#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1
//...
#endif /* _GLIBCXX_IOSTREAM */

你误解了警卫的工作方式。除了您正在编写的标题之外,您不需要为任何标题考虑这一点。请参阅示例。“我不想包含同一个库3次或更多次,因为它会使程序更重。”听起来您不需要担心程序一开始就“重”(不管您如何定义)。
已经包含相同(或类似)结构。你不需要自己再写一个。如果有合适的include-guard,多次包含同一个标题的成本很低(如“它可以忽略不计”)。“每个标题可以包含多次,与只包含一次没有区别,[…]”。因此,已经有一个要求,即使用某种类型的标题保护()