it-swarm.cn

如果我讨厌C ++头文件怎么办?

我总是对头文件感到困惑。它们是如此奇怪:您包含的.h文件不包含.cpp,但.cpp也已通过某种方式进行编译。

最近,我加入了一个团队项目,并且当然使用.h和.cpp。
我知道这很重要,但是我不能复制粘贴每个拥有的多个类中的每个函数声明。

如何有效处理2个文件的约定?
是否有任何工具可以帮助您解决此问题,或自动将以下示例中的一个文件更改为.h和.cpp? (特定于MS VC++ 2010)

class A
{
...
    Type f(Type a,Type b)
    {
        //implementation here, not in another file!
    }
...
};

Type f(Type a)
{
     //implementation here
}
...
25
Oleh Prypin

您可以使用 Lzz 。这是一个命令行工具,它接受以C++语法编写的声明,并生成头文件和源文件。

3
Mario Becerra

编写更多重构友好的C++

在C++中,您根本没有使用标头。您可以像使用C#或Java一样在一个文件中定义整个对象。 C开发人员通常只会将外部调用保留在头文件中。所有内部调用都将在.c文件中定义。同样,您可以为类/接口(纯虚拟抽象类)/ etc保留C++ .h文件。旨在在DLL之外共享的文件。对于内部类/结构/接口等,您只需包含所需的.cpp文件:

#include<myclass.cpp>

这似乎不是最受欢迎的方法,但它是合法的C++。您的所有内部代码绝对有可能。这允许内部代码和类集进行更大的改变,同时为库/可执行文件之外的代码提供更稳定的接口。

将整个班级放在一个文件中将使您更轻松地完成自己想要的事情。它不会解决重命名方法以及必须搜索该方法被调用的每个位置的问题,但是它将确保您拥有更多可理解的错误消息。没有什么比让标头以一种方式声明方法更糟糕了,但是您以不同的方式实现它。其他调用头文件的代码将正确编译,并且您将获得链接异常,而实现文件将是抱怨该方法未定义的文件。当您在实际的类声明中定义每个方法时,无论包含哪个文件,都将得到相同的错误消息。

您可能还想看一下这个问题: 适用于C++的良好重构工具

C/C++如何解析头文件/实现文件

在基础C级别上(并且C++是在此基础上构建的),头文件声明函数/结构/变量的promise足以允许编译器创建目标文件。类似地,C++头文件声明了函数,结构,类等的承诺。编译器使用此定义在堆栈中保留空间等。

.c或.cpp文件具有实现。当编译器将每个实现文件转换为目标文件时,存在未实现概念(在标头中声明的内容)的钩子。链接器将挂钩与其他目标文件中的实现联系起来,并创建一个包含所有代码(共享库或可执行文件)的较大二进制文件。

VS特定

至于使用Visual Studio中的工具,有一些向导可以使事情变得简单一些。新的类向导将创建匹配的头文件和实现文件对。甚至有一个类浏览器功能,将允许您声明新方法。它将在.cpp文件的标头和实现存根中注入定义。 Visual Studio拥有这些功能已有十多年了(只要我使用过它们)。

16
Berin Loritsch

成为Java开发人员。

如果确实必须使用C++进行开发,则可以尝试使用IDE。通常,它们提供了某种机制,您可以通过该机制将方法添加到类中,并且自动将声明放置在.h文件中,并将定义放置在.cpp文件中。

13
Paul Butcher

您可能对Hwaci的 makeheaders 程序(执行SQLite和Fossil的程序)感兴趣。

还可以看一看 Fossil的构建方式

8
Benoit

当您编写新类的第一行时,通常是因为您仅在那时才需要它。以后可能会在更多地方使用它,但最初通常不使用它。

我的许多课程都从当前.cpp文件的顶部开始。当它稳定到足以在多个地方使用时,我将其剪切粘贴到标题中。尽管课程经常以消失的速度消失。

5
Sjoerd

标头(.h)文件描述了interface代码,因为这是other代码可以看到的only位。

源(.cpp)文件提供了其他人不需要了解的代码的实现。

您包括不包括.cpp的.h文件...

正确。

作为此代码的使用者,您只需要Header文件,以便编译器知道该代码中的可用内容供您使用。此时,C++源代码未以任何方式,形状或形式使用(或至少不应被使用)。

...但是.cpp也以某种方式进行编译。

是的,但完全单独

该库的开发人员将您正在使用的模块/库的.cpp文件编译成一个目标文件(.o/.dll)。该目标文件将包含与Header文件中描述的入口点“形状”相同的入口点。

进入link完成的可执行文件时,您将需要该目标文件,此时链接程序可能会获取目标文件的内容并将其嵌入到您的可执行文件中(用于静态链接;动态链接会得到更复杂)
基本上,链接器必须根据您在标头文件中看到的内容以及实际包含的内容,在您的代码的入口点之间“连接点” expects库本身)。

0
Phill W.