【问题标题】:Best practices: c++ header includes [closed]最佳实践:C++ 标头包括 [关闭]
【发布时间】:2013-06-11 13:49:30
【问题描述】:

我目前正在学习 C++,我想我了解包含标题的大部分知识......来自根本不需要的语言,我经常有这样的感觉,“这是错误”或者应该有“更简单的方法来做到这一点”:

  1. 我发现在我想使用向量的每个类中都包含(例如)“向量”非常烦人。有没有更好的办法?

  2. 我有很多核心功能(也在它的单独命名空间中),其中有很多不经常更改的类。虽然我不需要每个类中的所有功能,但最好只有一个头文件,包含它并完成它......最好的方法是什么?

    李>
  3. 在预编译的头文件中包含头文件是不好的做法吗?如果是,为什么?

【问题讨论】:

  • 我很抱歉,但这不是这样的问题。我建议在谷歌上搜索这个主题,我记得阅读了一些关于标题管理的好技巧文章。
  • @Dariusz:我不同意。可以肯定的是,这是一个普遍的问题,但它说得很好,而不是以“教我 X”的形式。征求一般性建议是可以的,因为提问者可以设法提出一个不太笼统或不太广泛的问得很好的问题。我认为 cboe 在这里做到了。
  • 注意:clang 团队的 Douglas Gregor 正在致力于模块实现,作为未来标准化的开创性工作。已经很晚了,真的很晚了,但我们可能希望有一天 C++ 最终会得到一个合适的模块系统,我们可以摆脱那些头文件......
  • 对不起,如果我错过了 SO,我认为问题已经足够具体了!
  • 就目前而言,您有 3 个问题,而且都非常模糊。当然可以问你想问的问题,但尽量减少到 1 个问题,并尝试提出更具体的问题。

标签: c++ header include


【解决方案1】:

你认为#includeing 你需要什么,你需要什么是“错误的”,这可能来自——至少部分是——你的偏见来自其他不必要的语言。

在 C++ 中,驱动许多范式的理念是:“您无需为不使用或不需要的东西付费。”此清单的一种方式是需要#include 您正在编写的组件所需的任何标头。 #includeed 不会自动发生。

有一些既定的快捷方式可以让这更简单。一种这样的捷径是使用所谓的预编译头文件或全局头文件,它们本身#include 所有这些在您的项目中全局使用的低级内容。您可以在任何需要它的文件中编写这样的标题和 #include,而不是 #includeing 几个(或几十个)单独的文件。

“不用为不用的东西付费”理念的好处之一是在编译时获得。如果你只需要 3 个小头文件,#includeing 只需要这三个,而不是几十个不需要的东西,会加快编译时间。

【讨论】:

    【解决方案2】:
    1. 一般情况下没有,但也有例外。更重要的是 - 您不应该依赖包含的 h 文件中的包含,但有时您可以这样做。例如,在派生类中,您几乎可以依赖基类的包含。
    2. 制作您自己的包含,其中只包含一堆其他包含。但要小心。
    3. 对于不经常更改的大量包含,这是一个很好的做法。这在 posix 系统上也不是很常见的做法。

    【讨论】:

      【解决方案3】:

      1.我发现在我想使用向量的每个类中都包含(例如)非常烦人。有没有更好的办法?

      想象一下,对于使用您的代码的其他人(而其他人可能是您未来的自己)并因为缺少<vector> 的标头而出现编译错误是多么烦人。一次编写,多次使用。

      2.我有很多核心功能(也在它的单独命名空间中),其中有很多不经常更改的类。当我 不需要每个类中的所有功能,它会非常好 只有一个头文件,包括它并完成 它...最好的方法是什么?

      如果您让 IDE 自动将其包含为预编译头文件,您可以这样做以加快速度。但是仅仅为了正确性和可移植性,您不应该依赖它,并且始终让每个标头都可以编译为独立标头。参见例如Alexandrescu & Sutter's 编码标准中的第 23 项。像 CMake 这样的构建系统甚至有宏来测试这个。

      3.在预编译的头文件中包含头文件是不好的做法吗?如果是,为什么?

      您可以这样做,但最好让 IDE 这样做以获得更好的可移植性。并且那些标头最好是稳定的(例如标准库或 Boost,但绝不是您自己的项目标头)。

      【讨论】:

      • 非常感谢所有的答案,真的很有帮助。我发现这是最清楚的一个
      【解决方案4】:

      创建一个 common.h 头文件。在此包含所有必要的头文件,并将其包含在所有其他头文件中(我不知道其他的,但我们在我的项目中遵循此)。

      包含预编译的头文件是一个很好的做法(您必须只包含几乎不会更改的头文件)。但我只在 windows c++ 中看到了预编译的头文件(stdafx.h),在其他地方没有看到。

      【讨论】:

      • xcode 在 .pch 文件中也支持它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2011-07-23
      • 2011-04-08
      • 2010-09-27
      • 2010-11-17
      • 1970-01-01
      相关资源
      最近更新 更多