【发布时间】:2019-01-20 12:39:18
【问题描述】:
我正在用 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
我希望我的问题还没有被问到,因为我在搜索时没有找到它。
更新
对于那些说“你不在需要担心的位置”并且说“如果有适当的包含警卫,成本会很低”的人,我的意思是:程序的重量很重要,我想让它更轻,所以我不想多次完全包含同一个文件。标准库文件是否正确包含警卫? (我的头文件有,不知道std lib文件)
【问题讨论】:
-
您误解了包含警卫的工作方式。除了您正在编写的标题之外,您无需为任何标题考虑这一点。有关示例,请参见 en.wikipedia.org/wiki/Include_guard。
-
“我不想包含同一个库 3 次或更多次,因为它会使程序变得更重。” 听起来你并不完全处于你需要的位置一开始就担心你的程序很“重”(不管你怎么定义)。
-
<string>已经包含相同(或相似)的构造。你不需要自己写另一个。 -
多次包含同一个标头的成本非常少(如“它可以忽略不计”),如果它具有适当的包含保护。
标签: c++ preprocessor standard-library