【问题标题】:which one is right use of header file in C?哪一个是正确使用C中的头文件?
【发布时间】:2015-02-21 14:27:50
【问题描述】:

我真的很想知道使用头文件的正确方法。
下面是两种使用头文件的方法,我认为这两种方法都是好方法。

注意:Destroy.c 也使用 stdio.h、stdlib.h
1.

2。

请给我建议。谢谢

【问题讨论】:

  • 没有关于如何执行此操作的约定,通常取决于设置和目的。
  • 您是否在 Destroy.c 中使用 stdio.hstdlib.hstruct.h
  • 一般来说,您的 .h 文件不应拉取过多的头文件,因此如果您不需要头文件来定义接口和结构,请不要包含它。如果它们仅用于实现,则在每个需要它们的.c 文件中使用它们。在头文件中过度使用 include 可能会导致编译单元中的代码多于所需的代码,因此可能会不必要地增加编译时间,更重要的是,会泄漏对其他模块的依赖关系。
  • @user3595632 除非头文件需要#includes 才能正确编译/链接,否则不要包含它们。
  • @ChristianHackl 保留包含两个连续下划线的任何内容,以及以下划线开头后跟大写字母的任何内容。这适用于 C 和 C++。

标签: c++ c header


【解决方案1】:

不要建立不必要的依赖关系!

无需在destroy.h 中包含任何系统标头。如果destroy.c 中的代码需要,请在此处包含它们。

  • 使用标头保护。
  • 仅在需要的地方包含需要的内容。
  • 包括系统/库标头 1st。不遵守这条规则的情况非常罕见。

    更新为什么包含系统标头 1st

    系统头文件声明程序想要使用的“框架”。所以程序应该在声明自己的东西之前“知道”这个“框架”,因为它可能依赖于系统提供的东西。

    系统大多从不依赖程序提供的内容。

    对于库也是如此,从程序的角度来看,这些只是系统的补充。

【讨论】:

  • 但 destroy.c 也使用系统头文件。例如,它使用 printf
  • @user3595632:正如我所写:将所需的系统标头包含在destroy.c 中,但如果那里不需要它们,则不要包含在destoy.h 中。不要建立不必要的依赖!
  • 那么,在模块的头文件中(在这种情况下是Destroy.h),我们通常只输入函数的声明吗?由于在头文件中使用系统库真的很少见......(就像我想的......)
  • 正如我所写:包括必要的内容。在这种情况下,编译器会告诉你。对于destroy.h:是的,那里不需要包含。
  • @user3595632:在标头中使用标准函数很少见,但从那里使用类型则不然。如果您需要 FILE * 进行声明,则必须在标题中包含 <stdio.h>
【解决方案2】:

最好在每个模块中提及#include 行,以帮助记录该模块。这样,下一个处理您的代码的人可以查看它并看到,例如,“啊哈,这个模块使用标准库”。这是一种让您的依赖项对编译器和程序员都可见的方式。

因此,如果您在 Destroy.c 模块中使用 stdlib 的功能,请在 #include 行中提及它。如果你不这样做,就把它排除在外。

如果您的 main.c 程序使用您的 Destroy.c 模块中的功能,请在您的 main.c 中包含 Destroy.h

当您决定是否将系统头文件的#include 嵌套在您的一个头文件中时,情况也是如此(在我看来)。如果你的头文件中的东西使用了系统头文件中的东西,包括它。

这个头文件模式:

#ifndef MODULE_H
#define MODULE_H
  /* lots of stuff */
#endif

目的是可以在需要的地方提及每个头文件,而不必担心多次包含它。

另一个人建议以常规顺序显示您的#include 行,系统首先包含。这是个好主意。

所有这些只是惯例,而不是一成不变的规则。我正在提供一个对我服务过的团队来说效果很好的会议。

编辑 通常.c.h 文件是配对的。 .h 文件包含使用.c 文件中的函数所必需的声明。有时这只是一个函数声明,有时它还包括常量、结构和其他类似内容的声明。 (我在这里写的是C 语言。C++ 中的类定义规则比C 中的更清晰。)

您创建的头文件很少使用系统头文件中的内容,但并非不可能。可能的情况:声明一个执行某种错误记录的宏。

【讨论】:

  • 那么,在模块的头文件中(这里是Destroy.h),我们通常只输入函数的声明吗??
  • 由于在头文件中使用系统库真的很少见......(就像我想的......)
【解决方案3】:

简单地说,只有在需要调用 c 文件使用其原型/定义的函数/宏时,才应包含头文件。 因此,在您的情况下,如果您在 Destroy() 函数中使用任何 stdio/stdlib/struct 库预定义函数(如 printf-),请确保包含它们,如果您是不是,那么你不应该包含它们,尽管你是编译器甚至可能不会警告你。

此外,如果这是您在 ma​​in() 函数中调用的唯一函数,那么您不应在 ma​​in.c 中再次包含这些头文件> 文件。

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2014-12-24
    • 2020-07-24
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多