C ++ - 使用#include <classname>而不是#include <classname.h>是否有好处?

时间:2016-05-26 12:00:48

标签: c++ qt include

我知道标准库使用包含.h的旧C库,包括没有.h的最新库。但是对于自己的课程来说,更好的做法是什么?

我工作的地方总是有一个include文件夹,每个类有两个文件:classname.h和ClassName。 ClassName包含classname.h,classname.h包含真正的类头。要包含一个课程,请使用

#include <ClassName>

这就是Qt的方式,我很确定Qt是他们开始在我公司做的原因。但这有什么好处吗?

我认为缺点非常明显:

  • 为新类创建的另一个文件(我们使用bash脚本,但仍然)
  • 每个要管理的课程还有一个文件
  • 通过IDE重命名文件/类时,您通常需要手动调整ClassName文件(即使Qt Creator也不能这样做)
  • 除了std库和Qt
  • 之外,我从未见过这种风格

你使用这种风格吗?如果是这样,为什么?它的论点是什么?是否有更多反对它的论据?

1 个答案:

答案 0 :(得分:3)

首先,我要编写一个术语并将其称为&#34;特定于类的包含文件&#34;或&#34; CSIF&#34; 。这些文件不会以.h结尾,即使它们像标题一样使用,因此&#34;包含文件&#34;部分。既然我会继续提到这件事,我也可以给它一个首字母缩略词。

如何在Qt

中实现

Qt有一个&#34;标题&#34;每个定义的Qt classstruct没有扩展名的文件,此答案称为CSIF。 CSIF使用普通的头文件直接进入\include路径,但如果你打开一个文件,它们都会做同样的事情。让我们从QtWidgets中的包含文件开始,特别是与QStyleOption相关的文件:

\include
    ...
    QStyleOption
    qstyleoption.h
    QStyleOptionButton
    QStyleOptionComboBox
    ...

如果您打开其中一个与QStyleOption相关的CSIF,则所有CSIF都包含一行代码:

#include "qstyleoption.h"

qstyleoption.h

#include "../../src/widgets/styles/qstyleoption.h"

CSIF所做的只是#include来自源树的正确标题,用于命名的类。它在类的实际定义和之间创建抽象级别。需要使用#include语句。结果,这段代码:

//In some .cpp file somewhere
#include <QStyleOptionButton>
#include <QStyleOptionComboBox>

包含相同的头文件(当然是由警卫保护),但使用Qt的开发人员并不需要知道这一点。所有开发人员都关心的是他/她是否正在使用课程,并且他/她希望确定该课程是否可用。 我不知道这是不是原来的逻辑,但这就是它的影响。

您特定问题的答案

<强> 1。你用这种风格吗?如果是这样,为什么?
是的,但这只是因为我正在研究的项目模仿Qt库样式,因此Qt开发人员可以在Qt中轻松使用它。否则,[插入大量咒骂]。

<强> 2。它的论点是什么?
我所知道的唯一好的论据就是上面,Qt如何使用它来抽象出类和它们的定义的位置。作为Qt的用户,确保我包含正确的头文件是轻而易举的。如果我使用课程QFoo,则包含:<QFoo>。简单。

第3。是否有更多反对它的论据?
正如你在问题中所指出的,有很多反对它的论据。

  • 它使重构变得更加困难。
  • 如果您正在开发图书馆,它才真正有用。
  • 如果您的库具有API稳定性保证并且相当成熟,那么它只值得您的时间,因为它会使重构更加困难
  • 这意味着每个类,您的图书馆导出必须有一个CSIF,而丢失一个很容易。

我确信其他人可以提出更多CSIF让生活变得困难的例子。总之,在做出决定之前,必须权衡其在图书馆中增加的刚性和最终开发者的利益之间的平衡。

至于你的工作场所如何使用它...我耸耸肩。有人复制了Qt风格而不理解为什么,或许?