我是否必须包含包含函数定义的C文件?

我是否必须包含包含函数定义的C文件?,c,linker,include,declaration,extern,C,Linker,Include,Declaration,Extern,所以我一直在读一些书,我仍然在C中遇到外部关键字的问题 例如: 我有一个名为main.c的文件,在其中我声明了一个函数intadd(inta,intb);(使用前)。但是,函数的定义在math.c中。这是否意味着我必须将math.c和/或math.h文件包含在main.c(#include math.c/h)或main.h文件中,以便使用该函数而不会导致编译时错误?或者仅仅声明函数intadd(inta,intb)就足够了 简而言之:我必须包含定义函数声明的文件吗? 此外,如果仅仅声明函数就足够

所以我一直在读一些书,我仍然在C中遇到外部关键字的问题

例如: 我有一个名为main.c的文件,在其中我声明了一个函数intadd(inta,intb);(使用前)。但是,函数的定义在math.c中。这是否意味着我必须将math.c和/或math.h文件包含在main.c(#include math.c/h)或main.h文件中,以便使用该函数而不会导致编译时错误?或者仅仅声明函数intadd(inta,intb)就足够了

简而言之:我必须包含定义函数声明的文件吗?

此外,如果仅仅声明函数就足够了,那么这是一种良好的实践,还是链接器会处理它

谢谢。

您应该在“main.c”中包含“math.h”,并在“math.h”中放置
add
的定义:
intadd(inta,intb)

然后在“math.c”中包含“math.h”,并通过创建执行计算的代码在该文件中实际声明
add

然后,编译器将这两个.c文件分别编译为Linux/MacOS下的.o文件或Windows下的.obj文件。然后,链接器获取这两个.o/.obj文件并将它们链接在一起以生成完整的可执行文件

一般来说,扩展名为
.h
的头文件将包含在多个
.c
文件中,并提供有关在相应的
.c
文件中可以找到什么的信息。因此
math.h
包含所谓的
add
原型,这允许
main.c
了解函数,因此它能够正确地使用它,
math.c
包含实际的代码

虽然不是绝对必需的,但从长远来看,遵守此约定将使您的类似操作变得更容易,尤其是当您有包含许多
.c
.h
文件的大型项目时。这就是为什么你会发现它被用在几乎所有你下载的开源项目中

--编辑--

另外,一般来说,不要在
.c
文件中直接包含外部定义。始终尝试将它们放在
.h
头文件中。如果您的项目中有100个或更多的
.c
文件,并且您决定需要更改函数的原型,那么将它们直接放在
.c
文件中会造成维护噩梦。您现在必须编辑无数个
.c
文件,而不是编辑单个
.h
.c
对。这将非常容易出错。

您应该在“main.c”中包含“math.h”,并将
add
的定义放在“math.h”中:
intadd(inta,intb)

然后在“math.c”中包含“math.h”,并通过创建执行计算的代码在该文件中实际声明
add

然后,编译器将这两个.c文件分别编译为Linux/MacOS下的.o文件或Windows下的.obj文件。然后,链接器获取这两个.o/.obj文件并将它们链接在一起以生成完整的可执行文件

一般来说,扩展名为
.h
的头文件将包含在多个
.c
文件中,并提供有关在相应的
.c
文件中可以找到什么的信息。因此
math.h
包含所谓的
add
原型,这允许
main.c
了解函数,因此它能够正确地使用它,
math.c
包含实际的代码

虽然不是绝对必需的,但从长远来看,遵守此约定将使您的类似操作变得更容易,尤其是当您有包含许多
.c
.h
文件的大型项目时。这就是为什么你会发现它被用在几乎所有你下载的开源项目中

--编辑--


另外,一般来说,不要在
.c
文件中直接包含外部定义。始终尝试将它们放在
.h
头文件中。如果您的项目中有100个或更多的
.c
文件,并且您决定需要更改函数的原型,那么将它们直接放在
.c
文件中会造成维护噩梦。您现在必须编辑无数个
.c
文件,而不是编辑单个
.h
.c
对。这将非常容易出错。

一般来说,永远不要包含
#包含
*.c文件。但是,如果您想使用libm库中的函数,那么最简单的方法就是使用:
#include>math.h>
但是,如果您只是想为自己做更多的工作,那么就在
main.c
文件中编写函数的原型,就像用户3629249所说的那样,您不包括*.c文件。但是您需要将*.h文件包含到主文件中(我假设您有一个包含math.h声明的文件),并且需要将math.c与main.c一起编译,即gcc main.c math.c-o New_文件对不起,我想我的问题被误解了。这与功能本身无关,也与涉及的数学库无关。选择文件名是为了说明一个场景。我真正要问的问题是关于链接器,以及是否在使用函数的文件中包含具有给定声明定义的文件。一般来说,永远不要包含#include*.c文件。但是,如果您想使用libm库中的函数,那么最简单的方法就是使用:
#include>math.h>
但是,如果您只是想为自己做更多的工作,那么就在
main.c
文件中编写函数的原型,就像用户3629249所说的那样,您不包括*.c文件。但您需要将*.h文件包含到主文件中(我假设您有一个包含math.h声明的文件)