6

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

main.cpp
main.h

car.cpp
car.h

speed.cpp
speed.h
  • 第一 - 你应该有一个 main.h 吗?
  • 第二 - 如果 main.h 有 #include car.h 和 #include speed.h 那么在 car/speed.cpp 你只需要添加 #main.h (因此它将包括 car/speed.h)
  • 第三 - 你应该走那条路吗?
4

6 回答 6

12

#include极简主义。包含背后的原因应该是,如果删除,代码将无法编译。

#include当你可以前向声明时不要这样做。如果“A类;” 就够了,不要#include a.h

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

另请参阅相关问题中的自给自足的头文件。

于 2013-06-26T08:30:40.443 回答
4

1)仅当您需要将某些内容暴露main.cpp给其他cpp文件时,这取决于它所具有的内容。

2) 可能但不推荐。

3) 出于多种原因(代码设计、编译时间等),您希望包含尽可能少的内容。此外,它的约定让您的班级拥有 a.h和 a.cpp并且一个直接包含另一个。您还应该尝试在.cpp文件中包含标题,并尽可能避免包含标题的标题。

于 2013-06-26T08:30:32.130 回答
3

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

于 2013-06-26T08:30:15.970 回答
2

第一 - 你应该有一个 main.h 吗?

非常稀有。 main.cpp意味着它正在编译包含 的翻译单元main(),这通常是其他低级库的客户端代码,不需要了解main(). 如果某些事情在您的设计中出现了循环,并且有充分的理由(巨大的时间压力?)不将您要发布的内容拆分为单独.cppmain.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,如果它不想这样做并且汽车需要更高级别的头文件。 h 和 speed.h,它应该基于它们的总体主题(例如 transport.h)来命名,而不是以想要访问两者的特定客户端命名。请记住,main.h 只有在需要从 main.cpp 公开内容时才应该存在。

第三 - 你应该走那条路吗?

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

于 2013-06-26T08:40:45.857 回答
1

拥有“main.h”并不典型——但当然没有禁止它的规则。

至于需要包含哪些内容,以及如何实现这一点,实际上取决于各自的课程做了什么,他们需要什么彼此的知识。

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

于 2013-06-26T08:34:10.500 回答
0

您应该为要在代码中使用的源文件制作头文件。因此它不太可能——不是不可能——你必须创建一个 main.h 头文件,因为在 car.cpp 和 speed.cpp 中你可能不包含你在 main.cpp 中声明的函数。相反,您可能会在 main.cpp 中包含 car.cpp 和 speed.cpp 的功能,因此您希望将它们的标头包含在您的主文件中。

于 2013-06-26T08:30:24.543 回答