首页 > 解决方案 > 有 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 保护,成本很低”的人,我的意思是:程序的重量很重要,我想让它更轻一些我不想多次完全包含同一个文件。标准库文件是否正确包含警卫?(我的头文件有,不知道标准库文件)

标签: c++preprocessorstandard-library

解决方案


任何特定的预处理器符号都不需要标准头文件来#define确保它们可以被#included 多次。

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

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

来自C++ 标准

翻译单元可以以任何顺序 ( [lex] ) 包含库头。每个都可以被包含多次,与只包含一次没有任何不同的效果,除了每次包含<cassert>或的效果<assert.h>取决于 的词汇当前定义NDEBUG

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

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


推荐阅读