c++ - 有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?
问题描述
我正在用 C++ 构建自己的终端应用程序项目,我在问自己标准库是否有 ifdef 或 ifndef 预处理器指令。我想知道,因为我需要创建不同的头文件,这些头文件需要一些标准库头文件,例如“字符串”和其他一些头文件,所以我不想包含相同的库 3 次或更多次,因为它会使程序更重。
例如,我在我的头文件上写了这样的内容,以防止 .h 文件被多次包含:
#ifndef myheader_h
#define myheader_h
// my file code here
#endif
我尝试编译,但编译器对错误或警告一无所知。
我还尝试阅读标准库源代码(https://en.cppreference.com/w/cpp/header),但没有找到任何预处理器规则,如 ifdef 或 ifndef。
我应该包括这样的标准库头文件吗?
#ifndef string_h
#define string_h
#include <string>
#endif
我希望我的问题还没有被问到,因为我在搜索时没有找到它。
更新
对于那些说“你不在需要担心的位置”和“如果有适当的 include 保护,成本很低”的人,我的意思是:程序的重量很重要,我想让它更轻一些我不想多次完全包含同一个文件。标准库文件是否正确包含警卫?(我的头文件有,不知道标准库文件)
解决方案
任何特定的预处理器符号都不需要标准头文件来#define
确保它们可以被#include
d 多次。
话虽如此,任何理智的实现都将确保它们可以#include
多次执行,而不会对应用程序代码产生不利影响。
事实证明,这是大多数标头标准的要求(谢谢,@Rakete1111)。
来自C++ 标准
翻译单元可以以任何顺序 ( [lex] ) 包含库头。每个都可以被包含多次,与只包含一次没有任何不同的效果,除了每次包含
<cassert>
或的效果<assert.h>
取决于 的词汇当前定义NDEBUG
。
不仅如此,他们很可能会使用该#pragma once
指令。因此,即使您#include
对同一个标题多次使用,它们也只会被读取一次。
总之,不用担心标准头文件。如果你的头文件被正确实现,你的应用程序就可以了。
推荐阅读
- css - 关于相对/绝对 CSS 属性
- python - 如何打印列表中字符串之间的距离
- c# - 在这种情况下,单一职责原则如何避免代码异味?
- python-3.x - 为什么在带有 python3 内核的 jupyter-notebook 中,sys.version 显示 2.7.2,而不是 python3.x
- php - 如何在 wordpress + 主题位置上使用 css 修复响应式菜单
- spark-ar-studio - Spark Studio - 背景矩形填充与图像大小成比例的屏幕
- python-3.x - 如何修复 TypeError:“NoneType”不可迭代?
- c++ - 创建可以运行其他 dll 的 MFC。项目运行后调试断言失败
- laravel - 要求确认提交表格
- matlab - 如何做一个具有频率和幅度的正弦信号