在C++中,共享库的主头文件最佳实践是什么?

4
当我创建共享库时,我会在库源代码的根目录中添加一个无文件扩展名的头文件,与库同名。
例如,如果我的库名为libirock.so,那么我会在项目根目录下创建一个名为irock的文件。该文件将包含库中所有最重要的头文件,因此当实现该库时,您只需要使用以下include语句即可:
#include <irock> // Instead of <irock.h>

我从看到类似于以下编译器警告时得到了这个想法:

#include <string.h> is obsolete, use #include <string> instead

两个问题:

  1. 使用irock.h代替irock是最佳实践吗?
  2. 使用单个头文件而不是多个头文件是正确的吗?

行动方案

感谢您的答案!根据答案,我已决定:

  1. 将使用<irock.h>代替<irock>
  2. 我将继续使用“主”头文件。
5个回答

7

简单来说,不需要。你需要明确使用irock.h头文件。

有了扩展名,很明显这是一个头文件,任何基于文件扩展名的应用程序都可以正确地解释你的头文件。


5
不,使用 <header> 代替 <header.h> 这个惯用语只适用于标准库(以及标准模板库)的头文件。

谢谢你的回答 - 这是根据你的经验,还是普遍公认的经验法则? - Nick Bolton
我认为规范并没有明确禁止这样做,但通常遵循的是这种约定。 - Tyler McHenry
我相信你可能是对的...看到一篇关于这个的文章会很有趣。 - Nick Bolton
我相信标准规定C++标准库头文件不带“.h”扩展名,以便区分C和C++标准库头文件。 - John Watts

5

关于文件名扩展名的“允许”,“禁止”或“最佳实践”,标准中没有任何规定。

使用您喜欢的任何形式。在某些平台上,对于已注册类型的文件,具有文件扩展名会更加方便。

值得一提的是,<string.h><string>是完全不同的头文件。C++的命名空间等效于<string.h>实际上是<cstring>


0
在Qt4中使用的是“类名”方式来包含文件名,例如:
#include <QString>
#include <QWidget>
#include <QPainter>
#include <QApplication>
#include <QCoreApplication>

这些包含是虚拟的包含,将包含正确的头文件。在现实生活中,您会发现多个类在单个include.h中定义,并且您两次包含了该文件。

不使用“.h”版本的原因是您会被诱惑使用camelCase(或PascalNotation)的包含,如果您将代码从Windows移动到Unix(Linux或Mac),通常会遇到问题。这并不难做 - 但您确实需要注意正确地执行它。


1
当从Windows移植到UNIX时,无论文件扩展名是什么,大小写敏感性都可能成为一个潜在问题。#include指令应该使用与磁盘上文件名称相同的大小写。 - bk1e

0

#include

简单地将给定文件名的内容放入实际文件中。因此,如果您不带文件扩展名感觉更好,那就这样做吧。
当然,文件扩展名具有有用的语义含义。此外,大多数用户心目中没有扩展名的包含文件与标准库相关联。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接