【发布时间】:2014-11-23 14:19:56
【问题描述】:
我查找了头文件示例,但只能找到没有任何内容的简单示例。
所以我的问题是#include 像string 和vector 这样的东西在哪里?在 .h 或 .cpp 文件中?或者两者兼而有之?
【问题讨论】:
标签: c++ header include libraries
我查找了头文件示例,但只能找到没有任何内容的简单示例。
所以我的问题是#include 像string 和vector 这样的东西在哪里?在 .h 或 .cpp 文件中?或者两者兼而有之?
【问题讨论】:
标签: c++ header include libraries
任何你需要的地方。
如果您需要在头文件中声明的内容,请将它们包含在 .h 文件中。 否则就在 .cpp 文件中。
请注意,包含 .h 文件只是文本替换,包含的 .h 文件的内容将完全插入 在包含它们的文件的开头。在#include 线的精确点。
在标准库的头文件之前包含一个属于项目的头文件是一个很好的做法,如果不需要,则永远不要包含头文件。
您应该记住的最后一件事是,在处理 大型项目 时,如果多个翻译单元共享的 .h 文件中包含许多标头,如果标头被修改,则可能会增加编译时间。通常最好只在适当的文件(.cpp 或 .h)中包含您严格要求的内容。预编译的标头也可能会有所帮助,但这与您的问题无关。
最后:不要依赖“此标头已包含在其他地方,并且我已经通过第二个标头包含它”,因为它可能会导致难以跟踪依赖项并在项目增长时支持循环依赖项。
【讨论】:
#include 指令的确切位置,而不是在开头。意思是,如果你在文件的最后一行写#include,包含文件的内容将被插入到包含文件的末尾。
我在哪里#include 诸如字符串和向量之类的东西?在 .h 或 .cpp 文件中?
在这方面需要考虑多个问题,尤其是当项目变得更大时(即您的项目越大,这对您的影响越大)。
就个人而言,我遵循以下规则:
如果代码需要编译头文件,则需要包含它(如果头文件在 API 中使用 std::string 声明内容,则必须包含 string,C++ 文件也是如此)
不要包含不需要的标头(即不是“两者” - 如果您在 .h 文件中包含标头,然后包含您的 .h 文件,应该没问题)。
为您的项目文件组织标题优先级。这意味着如果您在 C++ 文件中有本地项目标头以及 std 和 boost 标头,您应该(可能)首先包含本地项目标头,然后是 boost,然后是 std。
这是因为 std 标头将是最受测试/最稳定的标头,也是最常用的 API(这是我的盲目假设)。如果您首先包含 std 标头,然后是项目标头(例如),因为替换是文本的,您可以不在项目标头中添加包含。这基本上会掩盖错误,因为从现在开始,您最终必须在所有其他 cpp 文件中的本地项目标头之前包含 std 标头。
【讨论】: