我的 Headers 中需要我的 #include 指令吗?
Do I Need My #include Directives In My Headers?
我是否需要在 header 中包含源文件中包含的所有内容?例如,我有一个名为 source.cpp 的文件,其开头为:
#include <string>
#include <vector>
#include <cctype>
然后我有一个名为 source.hpp 的 header,它只包含字符串。这编译得很好,但这是不好的做法,还是会导致将来出现并发症?
无需包含头文件中的所有内容。把需要的东西
在您的头文件中,只需将头文件包含在 .cpp 文件中。
更好的方法是在头文件中使用前向声明。这样你就可以避免不必要的编译。
header 绝对不需要 cpp 需要的所有 #include
。而且,我认为这种做法应该被劝阻,在某些情况下甚至是不可能的。
我认为你的 header 应该有 header 本身需要的东西,而 只有 (即 header 应该有尽可能少 #include
s),而你 cpp
拥有所有额外的 #include
s。另请注意,如果 cpp #include
s 为 header.
,则无需在 cpp 中重复 header 中的 #include
s
对于你的例子,我会
#include <string>
在 header 和
#include "source.hpp" // automatically includes string
#include <vector>
#include <cctype>
另请注意,前向声明可以进一步减少 header 中 #include
的数量。
源文件需要的一些 header 可能只是用于实现细节,所以不,没有必要 #include
它们也放在 header 中。
我遵循的规则是:#include
只有你绝对需要的在header文件中,然后在源文件中,#include
所有文件header 文件包括,以及实施细节所需的额外 headers。
如果有人想知道,我将所有 #include
指令从 header 复制到源文件中的原因是,以防万一我稍后替换 header 中的其中一个指令] 有了前向声明,我的源文件根本不需要改变。
我通常包括给定文件绝对必要的内容。
如果你的header使用字符串类型,那么添加一个#include <string>
。代码也一样。通常 header 受到保护,因此它既无害又有趣地表达(无需挖掘 headers/code 来确定什么是必要的)。
我总是建议将生产代码的#include 最小化。
尤其是在 header (.hh) 文件中。
在 'popular' header 文件中更是如此(header 文件被拉入数千次,使用 grep 或 find)。
甚至到了使用的程度
类、结构等的外部/前向声明,而不是包含(通过在 header 文件内使用引用或指针)和
对包含文件加倍 'guards'(where-included 和 in-the-header-file 中的#ifdef 守卫)和
重构 "very popular" 包含 header(即使检查未识别出 'poor cohesion' 的内容)。
原因:
我曾处理过大型构建(即 100 到 1000 个 KLOC)。
态度差w.r.t。 header-file-includes 对构建网络和服务器有显着的加载效果,从而影响所有团队的生产力。
我不止一次测量(使用“-H”和 C++ 映射和 wc)字节计数(字符)很好地进入 mulitple-terrabytes ... 来进行一次构建。共享网络和共享文件服务器上的巨大负载。
在那个环境中,清晨构建可能需要 40 分钟。
在繁忙的工作日中午左右,200 多名开发人员通常会吃很长时间的午餐,因为构建需要 3 到 4 个小时。
是的,当然可以提高编程技能,
我们可以使用 #include"string"
,
#include<string>
这样你就可以避免那些不会被使用的数据。仅从头文件中插入较少的数据,而不是所有内容。
我是否需要在 header 中包含源文件中包含的所有内容?例如,我有一个名为 source.cpp 的文件,其开头为:
#include <string>
#include <vector>
#include <cctype>
然后我有一个名为 source.hpp 的 header,它只包含字符串。这编译得很好,但这是不好的做法,还是会导致将来出现并发症?
无需包含头文件中的所有内容。把需要的东西 在您的头文件中,只需将头文件包含在 .cpp 文件中。 更好的方法是在头文件中使用前向声明。这样你就可以避免不必要的编译。
header 绝对不需要 cpp 需要的所有 #include
。而且,我认为这种做法应该被劝阻,在某些情况下甚至是不可能的。
我认为你的 header 应该有 header 本身需要的东西,而 只有 (即 header 应该有尽可能少 #include
s),而你 cpp
拥有所有额外的 #include
s。另请注意,如果 cpp #include
s 为 header.
#include
s
对于你的例子,我会
#include <string>
在 header 和
#include "source.hpp" // automatically includes string
#include <vector>
#include <cctype>
另请注意,前向声明可以进一步减少 header 中 #include
的数量。
源文件需要的一些 header 可能只是用于实现细节,所以不,没有必要 #include
它们也放在 header 中。
我遵循的规则是:#include
只有你绝对需要的在header文件中,然后在源文件中,#include
所有文件header 文件包括,以及实施细节所需的额外 headers。
如果有人想知道,我将所有 #include
指令从 header 复制到源文件中的原因是,以防万一我稍后替换 header 中的其中一个指令] 有了前向声明,我的源文件根本不需要改变。
我通常包括给定文件绝对必要的内容。
如果你的header使用字符串类型,那么添加一个#include <string>
。代码也一样。通常 header 受到保护,因此它既无害又有趣地表达(无需挖掘 headers/code 来确定什么是必要的)。
我总是建议将生产代码的#include 最小化。
尤其是在 header (.hh) 文件中。
在 'popular' header 文件中更是如此(header 文件被拉入数千次,使用 grep 或 find)。
甚至到了使用的程度
类、结构等的外部/前向声明,而不是包含(通过在 header 文件内使用引用或指针)和
对包含文件加倍 'guards'(where-included 和 in-the-header-file 中的#ifdef 守卫)和
重构 "very popular" 包含 header(即使检查未识别出 'poor cohesion' 的内容)。
原因:
我曾处理过大型构建(即 100 到 1000 个 KLOC)。 态度差w.r.t。 header-file-includes 对构建网络和服务器有显着的加载效果,从而影响所有团队的生产力。
我不止一次测量(使用“-H”和 C++ 映射和 wc)字节计数(字符)很好地进入 mulitple-terrabytes ... 来进行一次构建。共享网络和共享文件服务器上的巨大负载。
在那个环境中,清晨构建可能需要 40 分钟。
在繁忙的工作日中午左右,200 多名开发人员通常会吃很长时间的午餐,因为构建需要 3 到 4 个小时。
是的,当然可以提高编程技能,
我们可以使用 #include"string"
,
#include<string>
这样你就可以避免那些不会被使用的数据。仅从头文件中插入较少的数据,而不是所有内容。