【问题标题】:Why use separate source files?为什么要使用单独的源文件?
【发布时间】:2021-08-30 19:35:22
【问题描述】:

我正在学习 C,来自脚本语言背景,它非常有趣且令人困惑。

我是如何得到这个问题的一个简短的故事:

起初我很困惑为什么我不能在另一个源文件中包含源 (.c) 文件,然后我发现函数声明重复。然后我发现了头文件(.h)并且很困惑,为什么我必须在一个文件中声明一个函数然后在另一个文件中定义,然后如果有变化我必须去编辑2个文件,所以我开始在头文件中定义函数文件。然后我发现#ifndef 不能跨单独的源文件工作,所以这是我还找不到答案的问题:

为什么我什至必须使用单独的源文件?为什么我不能只拥有 1 个源文件并将所有其他代码/函数定义放在头文件中,这样我将定义一次并在最终构建中包含一次?

现在不要误会我的意思,我不认为我会开始一场革命,我只是在寻找为什么这不是它的工作原理的答案。

【问题讨论】:

  • 您不必必须使用单独的文件。一些编译器通过将许多源文件集中在一起并将它们编译成一个块来实现性能提升。但在所有其他条件相同的情况下,较小的文件比较大的文件更易于人类阅读。我担心这篇文章可能会吸引主要基于意见的答案,但现在我很想看看人们可能要说什么。

标签: c include header-files


【解决方案1】:

如果您考虑的不仅仅是小型学习程序,那么将代码拆分为多个源文件有几个好处。

代码组织

大型编程项目可能有 数百万 行代码。你不想拥有那么大的文件!编辑可能难以处理它。人类将难以理解它。多个开发人员会在涉及同一个文件时发生冲突。如果按目的分开代码,处理起来会容易得多。

构建时间

许多代码更改很小,而编译时间可能很昂贵。编译器通常一次处理一个文件,而不是文件的一部分。因此,如果您进行了微小的更改,然后必须重新构建整个项目,那可能会非常耗时。如果您的代码被分成多个源文件,对其中一个进行更改意味着您只需要重新编译那个文件

可重用性

通常,代码可以重复用于多个程序。如果您将所有代码都放在一个源文件中,则必须将该代码复制到另一个文件中以重用它。当然,现在如果它有一个错误,你有两个地方可以修复它。不好。

例如,假设您有使用链表的代码。如果您将链表代码放入其自己的源文件中,则可以简单地将其链接到另一个程序中。如果有错误,您可以在一个地方修复它,重新编译,然后重新链接使用它的程序。

【讨论】:

  • 但我想你不明白我的意思。在头文件中定义函数仍然会导致程序被拆分为多个文件,它们只是不是源文件而是头文件..?
  • @erdegis:它对构建时间没有帮助。头文件必须与#include 他们的源文件一起编译。不过,“仅标头库”也很有用。 C++ 经常使用它们。
【解决方案2】:

您可以为一些(小)项目使用单个源文件。

不过,对于许多项目来说,根据功能将源文件划分为不同的源文件是有意义的。
假设您正在制作游戏。

在其源文件中包含所有用户界面代码。
在其源文件中包含所有计算机移动算法。
...
拥有main() 函数,将其全部绑定在其源文件中。

然后,为PC编译你做gcc game.c algo.c ui-pc.c,编译到android你做gcc game.c algo.c ui-android.c ...,编译一个全新的算法你虽然不知道它是否好gcc game.c algo-test.c ui-pc.c


头文件有助于保持一切同步。它们是记录文档的好地方。

【讨论】:

  • 你能添加一些关于头文件和函数声明与定义的内容吗?这看起来像是 OP 特别想了解的概念
  • 我同意@TimRandall,这也是我的意思。将所有单独的代码放在单独的文件中,只是头文件而不是源文件。这样编译就简单多了:gcc main.c,你就完成了?
  • 头文件不应该有代码(我相信 C++ 对待这个问题的方式不同)。原因(主要是)如果头文件包含在 2 个(或更多)源文件中,则代码被复制(并且原型/类型/定义的复制是可以的)。此外,随着项目的发展......你从 gcc 移动到 make :-)
  • @pmg 但如果我有#ifndef,代码不会重复?
  • #ifndef 仅有助于从同一个 .c 文件中多次包含(可能通过不同的头文件)。假设您有#include "a,h"#include "b.h" ... 并且头文件b.h#include "a.h" ... 您的.c 文件受到保护,不会被a.h 多次包含。如果a.h 具有代码(不限于类型、宏、原型等),每个包含a.h.c 文件都将编译该代码的“其”版本,从而导致重复.
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2013-03-05
  • 2011-12-26
相关资源
最近更新 更多