有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?

Have C++ standard library ifdef or ifndef preprocessor instructions?

我正在用 C++ 构建我自己的终端应用程序项目,我在问自己标准库是否有 ifdef 或 ifndef 预处理器指令。我想知道,因为我需要创建不同的 header 文件,这些文件需要一些标准库 header,例如 "string" 和其他一些,所以我不想包含相同的库 3或更多次,因为它会使程序更重。
例如,我在 header 文件上写了这样的内容,以防止 .h 文件被多次包含:

#ifndef myheader_h
#define myheader_h
    // my file code here
#endif

我尝试编译,但编译器没有告诉我错误或警告。
我还尝试阅读 standard-library 源代码 (https://en.cppreference.com/w/cpp/header),但我没有找到任何预处理器规则,如 ifdef 或 ifndef。
我应该像这样包含标准库 header 吗?

#ifndef string_h
#define string_h
    #include <string>
#endif

我希望我的问题还没有被问到,因为我在搜索时没有找到它。

更新

对于一些说 "you're not in the position where you need to worry about""it costs very little if it has proper include guards" 的人,我的意思是:程序的重量很重要,我想让它更轻一些,所以我不想多次完全包含同一个文件。 std lib 文件是否正确包含警卫? (我的 header 文件有它们,不知道 std lib 文件)

标准 header 文件不需要 #define 任何特定的 pre-processor 符号来确保它们可以 #included 多次。

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

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

来自C++ standard

A translation unit may include library headers in any order ([lex]). Each may be included more than once, with no effect different from being included exactly once, except that the effect of including either <cassert> or <assert.h> depends each time on the lexically current definition of NDEBUG.

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

总而言之,不用担心标准 header 文件。如果您的 header 文件正确实施,您的应用程序就会很好。

I'm asking myself [sic] if standard library has ifdef or ifndef preprocessors instructions

该标准没有指定是否有 ifdef 风格的 header 守卫,尽管它确实要求以某种方式保护多重包含。我看了一下随机 header 的 stdlibc++ 标准库实现。它确实有 header 个守卫。

i don't want to include the same library 3 or more times because it makes the program heavier

多次包含 header 文件不会生成程序 "heavier"。

Should i include standard library headers like this?

#ifndef string_h
#define string_h
    #include <string>
#endif

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

你正在谈论的那些预处理器指令称为 "header guards",标准库 headers 肯定有它们(或其他一些做同样事情的机制)像所有其他适当的 header 文件。多次包含它们应该不会造成任何问题,您只需要在编写自己的 header 文件时担心这些问题。

您正在阅读的 "source code" 只是说明 header 文件应该如何工作的文档,但它不提供实际代码。要查看代码,您可以查看编译器提供的 header 文件。例如,Visual Studio中的<iostream>header既有#pragma once又有header守卫:

#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
//...
#endif /* _IOSTREAM_ */

GCC编译器提供的headers也有header守卫:

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