我查找了头文件示例,但只能找到没有要包含的简单文件。
所以我的问题是#include
和string
之类的内容vector
在哪里?在.h或.cpp文件中?或者两者兼而有之?
答案 0 :(得分:7)
您需要的任何地方。
如果您需要在头文件中声明的内容,请将它们包含在.h文件中。 否则只在.cpp文件中。
请注意,包含.h文件只是一个文本替换文件,所包含的.h文件的内容将完全插入文件开头的。位于#include
行的精确点。
最好在标准库之前包含项目所有标题,如果不需要,则不要包含标题。
您应该记住的最后一点是,当使用大型项目时,如果标题被修改,许多翻译单元共享的.h文件中包含许多标题可能会增加编译时间。通常首选在适当的文件中包含您严格要求的内容(.cpp或.h)。预编译的标题也可能有所帮助,但它与您的问题无关。
最后:不要依赖“这个标题已被包含在其他地方,我已经通过第二个标题包含它了”因为它可以渲染依赖关系 - 在项目增长时很难跟踪循环依赖关系。
答案 1 :(得分:2)
我在哪里#include字符串和向量之类的东西?在.h或.cpp文件中?
在这方面需要考虑多个问题,特别是当项目变得更大时(即项目越大,对您的影响越大)。
就个人而言,我遵循以下规则:
如果代码需要一个头来编译,那么你需要包含它(如果头部在API中用std :: string声明了东西,你必须包含string
,同样适用于C ++文件)
不包含不需要的标题(即不是"两者都是" - 如果您在.h文件中包含标题,那么请包含您的.h文件,您应该没问题)。
组织标题优先处理项目文件。这意味着如果你有一个C ++文件本地项目头,std和boost头,你应该(可能)先包含本地项目头,然后是boost,然后是std。
这是因为std标题将是最经过测试/稳定的标题,并且是最常用的API(这是我盲目的假设)。如果您首先包含std头,然后是项目头(例如),因为替换是文本的,您可以在项目头中不添加include。这基本上会掩盖错误,因为从现在开始,您最终必须在所有其他cpp文件中的本地项目头之前包含std头。