C约定 - 将H文件添加到项目文件中

时间:2014-07-29 16:58:17

标签: c conventions

一位工作的朋友今天告诉我

  

不添加头文件添加到C项目中的项目文件中是一种已知惯例。

我很震惊,找不到任何合乎逻辑的理由(因为我觉得这个惯例会让我很难找到我需要的文件)。

他解释说H文件实际上并不包含可编译的C代码,因此它不是“项目的一部分”,而只是元数据。

仅供参考 - 我们目前正在进行嵌入式项目。

例如 - 项目文件可以是带有IAR工作台的文件,或者Visual Studio中的vcxproj,或带有eclipse的cproject文件

有没有人遇到过这种惯例,可以说它有多受欢迎,它的实际优势/逻辑是什么?

4 个答案:

答案 0 :(得分:2)

我不相信这是一个惯例。头文件描述程序各部分之间的接口,我认为这比许多项目的特定代码位更重要。如果你进入C ++,你也可能会发现在头文件中实现项目代码的重要部分,以支持旧版C ++中的模板。

您的IDE旨在保持您正在使用的代码的正面和中心,这样您就可以访问所需的源代码并编辑任何代码,同时最大限度地减少上下文切换。

我的建议:将标题添加到项目中,但将它们分类到单独的文件夹,过滤器组或其他机制中,以便于访问。确保它们对编译器可见,将它们的构建目标设置为不编译(因为它们只是被包含在内)并且你应该被设置。

答案 1 :(得分:1)

向项目添加头文件没有任何缺点。

我发现的一些优点:

  • 如果我创建了源文件&#39; ,&#39;头文件&#39;等文件夹,并将相应的文件添加到文件夹,当你在IDE中打开项目时,它看起来很整洁,因为我可以直接看到我的项目中使用的头文件(大多数时候是由你创建的)< / p>

  • 在某些IDE(例如MSVC)中,如果已将该头文件添加到项目中,我可以使用搜索窗口直接搜索头文件。否则我需要打开其中一个包含的C / C ++文件这个标题必须从为该文件定义#include的行打开文件。

所以,无论你是否需要有条理的一切,这都取决于你。根据您的IDE等,您可以将头文件添加/排除到项目中。

希望这有帮助。

答案 2 :(得分:1)

我认为在项目文件中不包含.h文件的唯一原因是它们不是项目的一部分。例如stdio.h。我以前见过人们这样做会导致问题。主要问题是可以使您的项目不可移植。它还可能导致人们意外地修改他们不应该修改的文件。

这可能是你朋友在说什么吗?

答案 3 :(得分:0)

根据您的评论,看起来像一个反例就足以证明 .h 文件有时包含在项目文件中。以下是项目的Qt qmake .pro 文件的示例,其中列出了头文件:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.c \
    module.c

HEADERS += \
    module.h

为此,我首先使用 Qt Creator 将项目创建为“普通C项目”,然后使用Qt Creator生成module.hmodule.c存根,它添加到 .pro 文件中。现在 .pro 中的 .h 文件是可选的:项目将在没有它的情况下编译,但是导航项目等更难,我必须生成后,从 .pro 手动删除每个 .h


完全相反,我认为还有用于C项目的构建系统(及其项目文件),您实际上不需要列出任何文件。您只需列出目录,甚至具有标准目录布局,构建系统将扫描目录并根据其规则编译项目。我认为这至少可以用cmake实现。当然,对于许多项目文件类型(如普通的Makefile),您可以使用通配符查找目录中的所有.c文件。


至于为什么不列出.h文件的原因:

  • 编译器将根据#include找到.h文件,它们不在命令行中给出(仅包含目录)。
  • 现代IDE无论如何都会扫描源代码并查找所有使用过的包含文件而不列出它们。
  • 如果.h文件列表是手动维护的,但是如果忘记一个,那么在上面两点之后什么都不会实际失败,那么当有人忘记添加或删除一个时,项目文件中的列表可能会过时是变化。
  • 列出每个.c文件的构建依赖项实际上与仅列出项目文件中的.h文件有点不同,最好自动处理。
  • 使用版本控件应该消除文件之间的任何歧义,即使它们没有被使用(因为它们处于版本控制中),这些文件实际上也是项目的一部分,并且这些文件只是应该删除/忽略的混乱。

因此,如果项目文件中列出的 .h文件是任何额外的工作,并且如果它没有提供任何具体的优势(例如使用某些IDE),那么只是没有拥有它们似乎是明智的。