M. *_*tri 0 c++ preprocessor standard-library
我正在用C++构建自己的终端应用程序项目,我问自己标准库是否有ifdef或ifndef预处理器指令.我想知道,因为我需要创建不同的头文件,需要一些标准库头文件,如"字符串"和其他一些,我不想包括相同的库3次或更多次,因为它使程序更重.
例如,我在我的头文件上写了这样的东西,以防止.h文件被包含多次:
#ifndef myheader_h
#define myheader_h
// my file code here
#endif
Run Code Online (Sandbox Code Playgroud)
我尝试编译,但编译器没有说错误或警告.
我还尝试阅读标准库源代码(https://en.cppreference.com/w/cpp/header),但我没有找到任何预处理器规则,如ifdef或ifndef.
我应该包括这样的标准库标题吗?
#ifndef string_h
#define string_h
#include <string>
#endif
Run Code Online (Sandbox Code Playgroud)
我希望我的问题还没有被问到,因为我在搜索时没有找到它.
对于那些说"你不在你需要担心的位置"的人,以及谁说"如果它有适当的包括警卫就花费很少",我的意思是:程序的沉重很重要,我想让它变得更轻松所以我不想多次完全包含同一个文件.有std lib文件正确包含警卫吗?(我的头文件有它们,不知道std lib文件)
标准头文件不需要#define任何特定的预处理器符号,以确保它们可以#include多次d.
话虽如此,任何理智的实现都会确保它们可以#include多次执行而不会对应用程序代码产生负面影响.
事实证明,这是大多数标题的标准要求(谢谢,@ Rakete1111).
来自C++标准
翻译单元可以包括任何顺序的库标题([lex]).每个可以被包括不止一次,除了每次包括
<cassert>或<assert.h>依赖于词汇当前定义的效果之外,没有任何效果与被恰好包括一次有效NDEBUG.
不仅如此,他们很可能正在使用该#pragma once指令.因此,即使您#include对同一标头使用多次,它们也只会被读取一次.
总之,不要担心标准头文件.如果您的头文件正确实现,您的应用程序就可以了.