我找到了一些线程来解释为什么C ++将.cpp和.h文件分开(例如here)。如果我不将它们分开,我有兴趣知道它是否会导致任何问题。我不想共享目标文件,那么小项目分离的好处是什么?如果它只是减慢编译时间,我认为这不是什么大问题。我想用C ++重新实现一个Java程序,所以对我来说,将类保留在一个文件中似乎要容易得多。例如:
// Hello.cpp
#ifndef HELLO_20091218
#define HELLO_20091218
#include <iostream>
#include "Utils.cpp"
class Hello
{
public:
void start()
{
std::cout << Utils::nrand(100) << "\n";
// Utils and all other classes are written in a similar way
}
};
#endif
有一件事困扰着我。 “在类中定义成员函数会要求实现扩展对内联的调用。”因此,如果我喜欢这样,所有内容都隐式标记为内联。它会导致更大的可执行文件或任何其他缺点吗?
答案 0 :(得分:3)
这真的有两个问题。
现在,您在上面显示为“Hello.cpp”的内容看起来像一个标题,包含一个包含警卫。编译器并不关心你给你的标题提供什么名称,但是包含.cpp文件会让任何看着你代码的人感到困惑(充其量)。如果你自己编译这个,那么包含守卫(至少)可能应该去 - 虽然它不会引起真正的问题,但它最多只是毫无意义和混乱。
是的,您在类定义中定义的成员函数是隐式内联的。这并不意味着编译器需要为它们生成内联代码。它基本上只是编译器的一个提示,大多数编译器自己决定是否生成内联代码,主要基于函数包含的内容,而不是它定义的位置。
答案 1 :(得分:3)
在C和C ++中,最小的编译单位是文件。如果您只是不使用头文件并在“主”文件中包含所有内容,那么每次更改内容时都必须重新编译整个程序。对于较大的应用程序,这可以是分离头和实现的非常好的参数。此外,如果您的应用程序的另一部分将存在于另一个二进制可执行文件中并且您不想重用类,那么您可以安全地使用头文件,而如果没有它们,您将获得大量开销。
如果你不关心那些事情(你会后悔的。)你不需要单独的头文件。
关于内联:编译器无论如何都会内联很多函数(有时甚至是整个类),即使你没有要求它这样做。内联通常是性能的好处。有一些极端情况(可执行文件的大尺寸可以在较慢的执行中解析)但这些是相当不寻常的。
答案 2 :(得分:2)
头文件的目的是封装应用程序视为 API 的特定功能。
在许多情况下,相应的源文件位于单个库文件中,或者至少是一个独立的包。将源代码(作为单独的文件)直接组合到项目中是有利的,并且通常有助于开发,而不是构建库并将其链接在其中。
诸如 package , library 和 API 这样的词语充满了备用技术含义,这证明了开发人员对此类的重视程度。安排。
如果您认为您已经编写过的课程将来会有一些重用,那么打入单独的.cpp
和.h
文件并不是一件坏事,这样您就可以轻松地引用它了。在另一个项目中。至于编制速度的处罚,考虑长期收益与成本。 (而且编译器和硬件往往每年都会变得更快。)
答案 3 :(得分:1)
“当罗马人像罗马人那样做”
你被欺骗认为你可以选择像Java一样使用C ++。虽然这在技术上是正确的,但是你打破了一些非常强大的惯例。您可以轻松地开始使用new而不调用delete,因为“这不是什么大不了”,或者“您的程序很小”或“操作系统将在程序关闭后回收所有内存”,但这并不意味着您应该这样做。我同意C ++比Java更复杂,这可能是一个真正的痛苦,但这是你必须要处理的事情。这是每个C ++开发人员迟早会接受的。