我的 c 项目中哪个文件应该包含库?

Which file should include libraries in my c project?

我正在使用 ncurses 在 C 中编写 Pong 游戏。我将球、玩家和 AI 对手的函数定义分别放入 ball.cplayer.cai.c 中。这些文件中的每一个都包含另一个文件 pong.h,其中包含函数原型、结构定义和全局变量。我的主要功能在 pong.c 中,它提供游戏循环并处理按键。

我的项目还包括许多库:ncurses.hstdlib.htime.h。我应该在哪里包含这些库?目前,它们包含在 pong.h 中,如下所示:

#ifndef _PONG_H
#define _PONG_H

#include    <ncurses.h>
#include    <stdlib.h>
#include    <time.h>

/* everything else */

#endif

但是,只有某些文件使用 stdlib.h/time.h 中的函数。这让我相信,在使用它们的文件中只包含一次性库可能更有意义。另一方面,将所有库放在一个地方更直接。

我想知道是否有更传统或更有效的方法来做到这一点。

您最好在实际使用它们的文件中包含 header,即使它可能有点多余。这样,如果稍后您删除了对您定义的 header 的包含,如果该文件碰巧使用了 stdio.h 函数但没有自己包含它,则可以避免编译问题。

也可以一目了然地看到文件使用的前几行。

没有硬性规定,你应该在方便和卫生之间取得平衡。您已经知道元包含对于您的其他 .c 文件更方便,但我将强调一些与头文件有关的更模糊的问题:

  • 将依赖项(例如 ncurses.h)放入您的 public 头文件中可能会使将您的头文件包含在其他项目中变得更加困难
  • 头文件的传递成本将主导编译时间,因此减少不必要的包含将使您的项目编译更快。 Programs 已开发用于管理包含。
  • 头文件可能会破坏性地相互干扰,例如因为宏会改变随后包含的头文件的语义。 windows.h 可能是最臭名昭著的罪魁祸首,大型头文件或大型头文件集的风险可能难以量化。
  • 随着时间的推移,实际上应该捆绑哪些头文件会变得很明显,例如当便利收益高而风险和成本低时。在一个小项目上,也许从一开始就很明显。