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

标签 c++ preprocessor standard-library

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

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

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

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

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

更新

有些人说“你不需要担心”,还有人说“如果有合适的 include guards,成本非常低”,我的意思是:程序的重量很重要,我想让它更轻,所以我不想多次完全包含同一个文件。 std lib 文件是否正确包含 guard ? (我的头文件有它们,不知道标准库文件)

最佳答案

没有要求标准头文件到#define任何特定的预处理器符号以确保它们可以是 #include d 多次。

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

事实证明,这是大多数 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指示。因此,即使您使用 #include对于同一个 header 多次,它们将只被读取一次。

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

关于c++ - 有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51828147/

相关文章:

c++ - 从文件中读取行——删除多余的空格

c++ - epoll vs select 用于非常少量的连接

c++ - 为什么我不能在最新版本的 gcc 中使用 auto 关键字

http - 使用 http.ServeFile 更改 HTTP 代码

frameworks - 如何比较不同语言的大小标准库

c++ - std::vector 超出范围

c++ - 控制操作系统鼠标点击

c - C文件的部分预处理

ruby - 为什么我的 cocoapods post_install Hook 没有更新我的预处理器宏?

c++ - 在源代码中使用环境变量(编译时)