C++ 包括标题和Main.h

C++ 包括标题和Main.h,c++,include,header-files,C++,Include,Header Files,好的,我不确定这是正确的方法还是正确的方法,但我已经看到并开始使用它,比如说你有6个文件 main.cpp main.h car.cpp car.h speed.cpp speed.h 1-你是否应该有一个主要的.h 第二-如果main.h有#include car.h和#include speed.h,则输入 car/speed.cpp是否只需添加#main.h(因此 包括车辆/速度(h) 第三,你应该走那条路线吗 否通常没有main.h。我相信在源文件中包含所有需要的头文件是一种好的

好的,我不确定这是正确的方法还是正确的方法,但我已经看到并开始使用它,比如说你有6个文件

main.cpp
main.h

car.cpp
car.h

speed.cpp
speed.h
  • 1-你是否应该有一个主要的.h
  • 第二-如果main.h有#include car.h和#include speed.h,则输入 car/speed.cpp是否只需添加#main.h(因此 包括车辆/速度(h)
  • 第三,你应该走那条路线吗

否通常没有
main.h
。我相信在源文件中包含所有需要的头文件是一种好的做法,而不仅仅是在头文件中。如果您依赖头文件来包含所需的所有内容,则头文件中的更改可能会破坏源文件。

您应该为要在代码中使用的源文件创建头文件。因此,您不太可能(并非不可能)必须创建main.h标题,因为在car.cpp和speed.cpp中,您可能不包含在main.cpp中声明的函数。相比之下,您可能会在main.cpp中包含car.cpp和speed.cpp的功能,因此您希望在主文件中包含它们的标题。

1)仅当您需要将
main.cpp
中的某些内容公开给其他
cpp
文件时,这取决于它有什么

2) 可能,但不推荐

3) 出于许多原因(代码设计、编译时等),您希望包含尽可能少的内容。此外,您的类的惯例是有一个
.h
和一个
.cpp
,一个直接包含另一个。您还应该尝试在
.cpp
文件中包含标题,并尽可能避免包含标题的标题。

#最低限度地包含
。include背后的原因应该是,如果删除,代码将无法编译

当您可以转发声明时,不要包含
。如果“A类”就足够了,不要包含A.h

特别是,更喜欢在头文件中进行前向声明,避免嵌套的包含生成高度耦合的mega-include文件


另请参见一个相关问题。

使用“main.h”并不常见,但肯定没有规则禁止它

至于需要包括哪些内容,以及如何实现这一点,实际上取决于各个班级都做了什么,他们需要彼此了解什么

在您描述的样式中使用“一个包含所有其他内容的包含文件”通常被认为是一个坏主意。有几个原因: 1.很难看出哪个源文件依赖于哪个包含。 2.由于编译器必须通读大量未使用的类定义,因此编译时间更长。 3.如果没有“speed.h”,你不能轻易地把“car.h”和“car.cpp”放在另一个项目中

1-你是否应该有一个主要的.h

很少
main.cpp
意味着它正在编译包含
main()
的翻译单元,这通常是其他不需要了解
main()
中符号的低级库的客户端代码。如果您的设计中出现了某种循环,并且有充分的理由(巨大的时间压力?)不将输出的内容拆分为一个单独的
.cpp
,那么您可能会得到一个
main.h
。这实际上应该只声明main.cpp中其他翻译单元可能需要访问的符号。具体来说,它不应该包括car.h和/或speed.h,除非公开需要car.h或speed.h声明的main.h函数-例如,main.cpp中的函数声明,该函数从car.h或speed.h中获取类型参数

第二-如果main.h有#include car.h和#include speed.h,那么在car/speed.cpp中,您是否只需要添加#main.h(因此它将包括car/speed.h)

如上所述,这几乎可以肯定是一个非常破碎的设计:main.cpp应该直接包括car.h和speed.h,如果它不想这样做,并且car.h和speed.h需要更高级别的标题,那么应该根据它们的总体主题(例如transport.h)来命名,不以希望访问这两个客户端的特定客户端命名。记住,main.h应该只在需要从main.cpp公开内容时存在

第三,你应该走那条路线吗


考虑到我上面的解释,可能不会。

关于远期申报的观点很好。我仍然相信,在其中包含编译.cpp文件所需的所有内容是一种很好的做法。@IvayloStrandjev我同意。包括你需要的一切,只包括你需要的。“不要包括你可以转发声明的时间。如果”A类;“足够了,不包括a.h.”-强烈反对。。。假设“a”库将a更改为
模板类basic\u a…
然后提供
typedef basic\u a。。。你的身体不必要地坏了。“A”的所有权属于“A”库,并且在必要时“A”中的声明“A”应该拆分一个轻量级的前向声明头(在标准<代码> <代码>中的先例),但是您不应该声明它而不包含“A”标题。@ Tunyd,我不认为这是一个非常常见的情况。无论如何,如果我以如此激进的方式更改标识符“A”,破坏构建只是一个自然的结果。谢谢,不确定为什么有人会标记这个问题,但我已经准备好了我的答案:包括*不包括,出于某种恼人的原因,请更改它。