我的 c 项目中哪个文件应该包含库?
Which file should include libraries in my c project?
我正在使用 ncurses 在 C 中编写 Pong 游戏。我将球、玩家和 AI 对手的函数定义分别放入 ball.c
、player.c
和 ai.c
中。这些文件中的每一个都包含另一个文件 pong.h
,其中包含函数原型、结构定义和全局变量。我的主要功能在 pong.c
中,它提供游戏循环并处理按键。
我的项目还包括许多库:ncurses.h
、stdlib.h
和 time.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
可能是最臭名昭著的罪魁祸首,大型头文件或大型头文件集的风险可能难以量化。
- 随着时间的推移,实际上应该捆绑哪些头文件会变得很明显,例如当便利收益高而风险和成本低时。在一个小项目上,也许从一开始就很明显。
我正在使用 ncurses 在 C 中编写 Pong 游戏。我将球、玩家和 AI 对手的函数定义分别放入 ball.c
、player.c
和 ai.c
中。这些文件中的每一个都包含另一个文件 pong.h
,其中包含函数原型、结构定义和全局变量。我的主要功能在 pong.c
中,它提供游戏循环并处理按键。
我的项目还包括许多库:ncurses.h
、stdlib.h
和 time.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
可能是最臭名昭著的罪魁祸首,大型头文件或大型头文件集的风险可能难以量化。 - 随着时间的推移,实际上应该捆绑哪些头文件会变得很明显,例如当便利收益高而风险和成本低时。在一个小项目上,也许从一开始就很明显。