【问题标题】:Is really required to separate c++ constructions in a .h and a .cpp files?真的需要在 .h 和 .cpp 文件中分离 c++ 结构吗?
【发布时间】:2019-11-21 20:00:12
【问题描述】:

好吧,我进入了 C++ 世界,这个疑问就解决了。

对于我选择包含在我的程序中的每个 meaning-unit 都有 2 个文件太无聊了。 我知道我可以在同一个(一对)档案中拥有多个类,但是我想澄清一下,如果真的没有办法只写一个文件,而不是 .h.cpp 那些。

我发现了一些其他的答案(如thisthatthat other),实际上它们非常具有解释性,但也很老。所以跳跃语言有一些改进我来问:

是否有一些编译选项、任何其他替代扩展或任何其他允许我只编写一个文件的东西?

我很感激!

【问题讨论】:

  • 不,(还)没有合适的方法 - 模块。他们发现更重要的东西要添加到语言中,而不是修复过时且非常糟糕的技术 - 预处理器。
  • 不是必须的,你可以把所有东西都放在一个.h或一个.cpp里,但是很不方便

标签: c++ c++11 compilation


【解决方案1】:

好的,您需要了解发生了什么。这不是 Java。

.h 文件是您班级的定义。它只是一个包含文件,可以在其他地方使用,以便其他地方了解您的类。现在,您实际上可以内联构造构造函数,如下所示:

public:
     Foo() { ... your code here ... }

这是完全合法的。但是这个问题很简单。在您点击此构造函数的任何地方,编译器都必须内联插入该代码。这会导致在您创建新 Foo 的任何地方都有大量相同的代码。

如果您将代码放入您的 .cpp 文件中,然后编译它,您将获得一个 .o 文件。该 .o 文件包含您的构造函数的单个副本,这就是在您创建 Foo 的任何地方都会调用的内容。

因此,将定义与代码分开会导致程序更小。如今,这已不像过去那么重要了。

这是 C++ 的本质,你应该接受它。

.h 是一个包含文件,用于其他地方。 .cpp 是实现。一旦你习惯了,这并不繁重。

【讨论】:

  • 在你点击这个构造函数的任何地方,编译器都必须内联插入该代码。 你能备份一下吗? inline 实际上并不意味着内联代码,它意味着忽略重复的定义。
  • 我想过更精确,但不想让答案更冗长。这是 C++ 的新程序员,我不想一次添加太多。是的,您可能会得到每个 .o 文件的一份副本。确实如此。但这仍然可能是很多副本。
  • 虽然 .o 文件会有一个副本,但最终的可执行文件不会有这些副本,因为链接器会将它们“合并”成一个。
【解决方案2】:

您必须了解 C++ 是一种编译语言。例如,当您编译一个库时,该库包含特定于机器的代码。如果您想编写一个使用该库的程序,您的程序必须能够查看函数和类定义才能正确链接该库。另一方面,绝对有可能将整个程序编写在头文件中——事实上,存在术语仅头文件库来描述没有预编译机器代码的库。这意味着编译它的责任落在你身上。您可能会有更长的编译时间,因此,非常大的库几乎完全预编译为特定于平台的二进制文件(在您的机器没有一组二进制文件的情况下,您必须从源代码和链接编译反对结果)。理论上,可以重写 C++ 规范,只需要一个文件,但是这些文件需要存在于包含该库的任何项目中。对于非常大的库,这可能会很痛苦——当您可以只包含链接到二进制文件所需的定义时,为什么还要包含某些引擎的完整源代码?这提供了从客户端程序混淆算法和实现细节的额外优势。 C++ 不是一种解释型编程语言——从编译器的角度来考虑它是很重要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多