有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?
Have C++ standard library ifdef or ifndef preprocessor instructions?
我正在用 C++ 构建我自己的终端应用程序项目,我在问自己标准库是否有 ifdef 或 ifndef 预处理器指令。我想知道,因为我需要创建不同的 header 文件,这些文件需要一些标准库 header,例如 "string" 和其他一些,所以我不想包含相同的库 3或更多次,因为它会使程序更重。
例如,我在 header 文件上写了这样的内容,以防止 .h 文件被多次包含:
#ifndef myheader_h
#define myheader_h
// my file code here
#endif
我尝试编译,但编译器没有告诉我错误或警告。
我还尝试阅读 standard-library 源代码 (https://en.cppreference.com/w/cpp/header),但我没有找到任何预处理器规则,如 ifdef 或 ifndef。
我应该像这样包含标准库 header 吗?
#ifndef string_h
#define string_h
#include <string>
#endif
我希望我的问题还没有被问到,因为我在搜索时没有找到它。
更新
对于一些说 "you're not in the position where you need to worry about" 和 "it costs very little if it has proper include guards" 的人,我的意思是:程序的重量很重要,我想让它更轻一些,所以我不想多次完全包含同一个文件。 std lib 文件是否正确包含警卫? (我的 header 文件有它们,不知道 std lib 文件)
标准 header 文件不需要 #define
任何特定的 pre-processor 符号来确保它们可以 #include
d 多次。
话虽如此,任何理智的实现都会确保它们可以 #include
d 多次而不会对应用程序代码产生不利影响。
事实证明,这是大多数 header 标准的要求(谢谢,@Rakete1111)。
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 <cassert>
or <assert.h>
depends each time on the lexically current definition of NDEBUG
.
不仅如此,他们很有可能正在使用#pragma once
指令。因此,即使您对同一个 header 多次使用 #include
,它们也只会被读取一次。
总而言之,不用担心标准 header 文件。如果您的 header 文件正确实施,您的应用程序就会很好。
I'm asking myself [sic] if standard library has ifdef or ifndef preprocessors instructions
该标准没有指定是否有 ifdef
风格的 header 守卫,尽管它确实要求以某种方式保护多重包含。我看了一下随机 header 的 stdlibc++ 标准库实现。它确实有 header 个守卫。
i don't want to include the same library 3 or more times because it makes the program heavier
多次包含 header 文件不会生成程序 "heavier"。
Should i include standard library headers like this?
#ifndef string_h
#define string_h
#include <string>
#endif
这不是必需的,或者特别有用。
你正在谈论的那些预处理器指令称为 "header guards",标准库 headers 肯定有它们(或其他一些做同样事情的机制)像所有其他适当的 header 文件。多次包含它们应该不会造成任何问题,您只需要在编写自己的 header 文件时担心这些问题。
您正在阅读的 "source code" 只是说明 header 文件应该如何工作的文档,但它不提供实际代码。要查看代码,您可以查看编译器提供的 header 文件。例如,Visual Studio中的<iostream>
header既有#pragma once
又有header守卫:
#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
//...
#endif /* _IOSTREAM_ */
GCC编译器提供的headers也有header守卫:
#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1
//...
#endif /* _GLIBCXX_IOSTREAM */
我正在用 C++ 构建我自己的终端应用程序项目,我在问自己标准库是否有 ifdef 或 ifndef 预处理器指令。我想知道,因为我需要创建不同的 header 文件,这些文件需要一些标准库 header,例如 "string" 和其他一些,所以我不想包含相同的库 3或更多次,因为它会使程序更重。
例如,我在 header 文件上写了这样的内容,以防止 .h 文件被多次包含:
#ifndef myheader_h
#define myheader_h
// my file code here
#endif
我尝试编译,但编译器没有告诉我错误或警告。
我还尝试阅读 standard-library 源代码 (https://en.cppreference.com/w/cpp/header),但我没有找到任何预处理器规则,如 ifdef 或 ifndef。
我应该像这样包含标准库 header 吗?
#ifndef string_h
#define string_h
#include <string>
#endif
我希望我的问题还没有被问到,因为我在搜索时没有找到它。
更新
对于一些说 "you're not in the position where you need to worry about" 和 "it costs very little if it has proper include guards" 的人,我的意思是:程序的重量很重要,我想让它更轻一些,所以我不想多次完全包含同一个文件。 std lib 文件是否正确包含警卫? (我的 header 文件有它们,不知道 std lib 文件)
标准 header 文件不需要 #define
任何特定的 pre-processor 符号来确保它们可以 #include
d 多次。
话虽如此,任何理智的实现都会确保它们可以 #include
d 多次而不会对应用程序代码产生不利影响。
事实证明,这是大多数 header 标准的要求(谢谢,@Rakete1111)。
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
<cassert>
or<assert.h>
depends each time on the lexically current definition ofNDEBUG
.
不仅如此,他们很有可能正在使用#pragma once
指令。因此,即使您对同一个 header 多次使用 #include
,它们也只会被读取一次。
总而言之,不用担心标准 header 文件。如果您的 header 文件正确实施,您的应用程序就会很好。
I'm asking myself [sic] if standard library has ifdef or ifndef preprocessors instructions
该标准没有指定是否有 ifdef
风格的 header 守卫,尽管它确实要求以某种方式保护多重包含。我看了一下随机 header 的 stdlibc++ 标准库实现。它确实有 header 个守卫。
i don't want to include the same library 3 or more times because it makes the program heavier
多次包含 header 文件不会生成程序 "heavier"。
Should i include standard library headers like this?
#ifndef string_h #define string_h #include <string> #endif
这不是必需的,或者特别有用。
你正在谈论的那些预处理器指令称为 "header guards",标准库 headers 肯定有它们(或其他一些做同样事情的机制)像所有其他适当的 header 文件。多次包含它们应该不会造成任何问题,您只需要在编写自己的 header 文件时担心这些问题。
您正在阅读的 "source code" 只是说明 header 文件应该如何工作的文档,但它不提供实际代码。要查看代码,您可以查看编译器提供的 header 文件。例如,Visual Studio中的<iostream>
header既有#pragma once
又有header守卫:
#pragma once
#ifndef _IOSTREAM_
#define _IOSTREAM_
//...
#endif /* _IOSTREAM_ */
GCC编译器提供的headers也有header守卫:
#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1
//...
#endif /* _GLIBCXX_IOSTREAM */