将C ++代码划分为.h和.cpp文件的工具对程序员是透明的

时间:2012-04-06 15:27:10

标签: c++ ide

C ++是我学过的第一种语言,因此将源代码分成.h和.cpp文件似乎很明显 - 但是在学习了C#和Java之后,他们现在看起来非常笨拙。它们可能在60年代有用,甚至可能在80年代,但在现代工具时代,例如带折页的IDE和文档生成器,它们似乎已经过时了。

无论如何,我的问题是:是否有一个工具可以使这两种文件对程序员透明?例如,让编码器在头文件中编写方法的定义,但实际上将其保存到.cpp文件中?

(我知道可以尝试仅在头文件中编写C ++程序,但AFAIK这不被认为是最佳实践,使程序构建更长,并使两个类几乎不可能相互引用。)

4 个答案:

答案 0 :(得分:4)

我在问题,评论和对其他答案的评论中看到的讨论似乎集中在组件的文本表示上。从纯文本的角度来看,完全删除标题是有意义的。

另一方面,header和cpp文件的分离还有第二个层次,它将接口与实现分开,并在此过程中从接口中删除实现细节。

这种情况以不同的方式发生,在最简单的层面如何实现特定的功能与组件的用户无关[*]。在许多情况下,.cpp文件中可以包含更多类型和函数,这些类型和函数仅用作实现的详细信息。此外,如果您决定直接实施特定功能或依赖于另一个库,则是实施细节,不应泄露给您的用户。

在自动管理文件分离的工具中,这种分离可能也可能不容易实现,而那些喜欢使用仅头库的人无法完成。

如果有人声称没有必要转到定义,并希望完全看到代码,我看到的是决定组件的哪些部分的灵活性是详细信息,用户不应该知道。在许多IDE中(并且,甚至在vim中),只有一个按键组合可以将您从一个转到另一个。在IDE中,您可以重构函数的签名,并让IDE将更改应用于标题和实现(有时甚至是用途)......

如果您要使用工具提供标题和实现的统一视图,那么使该工具知道您正在编写的代码的哪些部分是接口或实现的一部分可能要困难得多,以及该工具可能产生的决策可能会对生成的程序产生影响。

单独的编译模型有它的缺点,但也有优点,我觉得这里讨论的只是在深层次的设计决策的表面上。

[*]似乎有不少人认为每个类都应该有自己的头文件和.cpp文件,我不同意,每个头代表一个可能是单个类的组件,或者多个类和免费函数文件中的代码分离是 design 的一部分,在单个组件中,您可能有一个或多个公共类型,可能没有或多个内部类型。

答案 1 :(得分:3)

我不知道是什么让分区变成源/标题完全透明。

但是,我确实知道一些使它更容易处理的东西。例如,Visual Assist X将允许在标题中编写整个类,然后选择成员函数,并将它们移动到源文件(即.cpp文件)。

这不是一种完全治愈方法(无论如何),但无论如何它都可以/确实使它们更加可忍受。

就个人而言,我认为完全摆脱文件会很有趣,而是直接使用类似数据库的东西 - 也就是说,你有一个函数数据库,其中该函数的源代码是一列,目标代码另一个,内部编译器有关如何使用它的信息,等等。这也可以使集成版本控制非常简单(基本上只是存储的事务日志)。

答案 2 :(得分:1)

我,就像C ++中的头文件一样,因为它们可以作为一种类型的“目录”,它可以让您快速浏览一个类。当然,这是假设您将标题缩短,并将大多数函数的实现放入.cpp。

此外,您可以获取Visual Studio的插件,该插件将成员函数的实现从标头移动到.cpp中。加上Visual Studio中的“转到定义”和“转到声明”命令,使得标题对于导航大型代码库非常有用。

答案 3 :(得分:0)

标头是当前C ++编译模型的基础。我认为有些事情在没有将程序员直接暴露给header / cpp split的情况下表达起来有点困难。例如,在某些情况下,:

之间存在显着差异
// header
class Foo {
    Foo() = default;
}

// header
class Foo {
    Foo();
};

// cpp
Foo::Foo() = default;

尽管如此,我认为考虑改进编译模型或使其更易于处理是值得的。

例如,我可以想象一个'代码气泡'样式的IDE,程序员在代码气泡中编写定义,然后将气泡组合成翻译单元。程序员将定义标记为“已导出”以使其可供其他TU使用,并且对于每个TU,他将从其他单元中选择要导入的导出项目。 IDE一直在维护它自己的程序代码泡泡表示,当你构建它时,会根据需要生成传递给编译器,创建前向声明等所需的实际cpp文件。 cpp文件只是一个中间构建产品。

虽然我上面展示了一个微妙之处,但我不确定我描述的IDE会如何处理。