Have C++ standard library ifdef or ifndef preprocessor instructions?
我正在用C ++构建自己的终端应用程序项目,并问自己标准库是否包含ifdef或ifndef预处理程序指令。我想知道,因为我需要创建不同的头文件,而这些头文件需要一些标准库头(例如" string")和其他一些头文件,因此我不想包含同一库3次或多次,因为它会使程序变重。 br />
例如,我在标头文件中写了类似这样的内容,以防止.h文件被多次包含:
1 2 3 4 | #ifndef myheader_h #define myheader_h // my file code here #endif |
我尝试编译,但编译器对错误或警告一无所知。
我还尝试阅读标准库的源代码(https://en.cppreference.com/w/cpp/header),但没有找到任何预处理程序规则,例如ifdef或ifndef。
我应该包括这样的标准库头吗?
1 2 3 4 | #ifndef string_h #define string_h #include <string> #endif |
我希望我的问题没有被问到,因为我在搜索时没有找到它。
更新
对于那些说"您不必担心"的人,以及"如果有适当的包含保护程序,它的成本非常低"的人,我的意思是:程序的繁重很重要,我想使它更轻一点我不想多次完全包含同一文件。标准的lib文件是否包含适当的防护措施? (我的头文件有它们,不知道std lib文件)
不需要标准头文件将
话虽如此,任何理智的实现都将确保它们可以多次被执行,而不会对应用程序代码产生不利影响。
事实证明,这是大多数标头的标准要求(谢谢@ Rakete1111)。
从C ++标准
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
or depends each time on the lexically current definition of NDEBUG .
不仅如此,它们很有可能正在使用
总之,不用担心标准头文件。如果头文件正确实现,那么您的应用程序就可以了。
您正在谈论的那些预处理器指令称为"头保护器",标准库头肯定具有它们(或其他执行相同功能的机制),就像所有其他适当的头文件一样。多次包含它们不会造成任何问题,并且在编写自己的头文件时只需担心这些问题。
您正在阅读的"源代码"只是说明头文件应如何工作的文档,但没有提供实际的代码。要查看代码,您可以查看编译器提供的头文件。例如,Visual Studio中的
1 2 3 4 5 | #pragma once #ifndef _IOSTREAM_ #define _IOSTREAM_ //... #endif /* _IOSTREAM_ */ |
GCC编译器提供的标头还具有标头防护:
1 2 3 4 | #ifndef _GLIBCXX_IOSTREAM #define _GLIBCXX_IOSTREAM 1 //... #endif /* _GLIBCXX_IOSTREAM */ |
I'm asking myself [sic] if standard library has ifdef or ifndef preprocessors instructions
该标准没有指定是否存在
i don't want to include the same library 3 or more times because it makes the program heavier
多次包含头文件不会使程序"变重"。
Should i include standard library headers like this?
1
2
3
4 #ifndef string_h
#define string_h
#include <string>
#endif
那不是必需的,或者是特别有用的。