Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的标题是必要的吗?_C_Recursion_Header - Fatal编程技术网

C中的标题是必要的吗?

C中的标题是必要的吗?,c,recursion,header,C,Recursion,Header,我是个初学者,请先原谅我。 我开始学习C语言,头的概念作为必要的东西出现在我的课程中。但当我想测试时,我创建了一个额外的文件,所以现在我有两个文件:main.c和test.c。我在test.c中创建了一个函数,并在main.c文件中运行它。一开始我认为它不起作用,因为我没有为预处理器创建头文件,也没有test.c,但它做到了。我在多个google搜索中发现,使用标题与函数是静态的(本地的)有关,我理解,但其他回复指出,这与交叉递归问题有关,使编译更容易,但当我搜索更多信息时,我没有发现任何清晰的

我是个初学者,请先原谅我。 我开始学习C语言,头的概念作为必要的东西出现在我的课程中。但当我想测试时,我创建了一个额外的文件,所以现在我有两个文件:main.c和test.c。我在test.c中创建了一个函数,并在main.c文件中运行它。一开始我认为它不起作用,因为我没有为预处理器创建头文件,也没有test.c,但它做到了。我在多个google搜索中发现,使用标题与函数是静态的(本地的)有关,我理解,但其他回复指出,这与交叉递归问题有关,使编译更容易,但当我搜索更多信息时,我没有发现任何清晰的信息。 首先,这些是我们需要标题的真正原因吗? 第二,人们所说的“交叉递归问题和简化编译”是什么意思?
谢谢。

头文件是否需要取决于您想要实现的目标。 编译.c文件时,编译该文件中包含的所有代码。如果要使用另一个文件或库中的元素(函数、常量等),编译器必须知道此类元素的存在及其位置

因此,这里有两个选项:要么在正在编译的文件的代码中定义元素,要么在其他地方定义元素。在本例中,您希望使用另一个文件中的元素。因此,编译器必须有一种方法知道这样的函数存在并被实现。这就是#include指令的来源。 这是一个预处理器指令,即编译前的步骤,其中代码准备编译。这主要是删除注释和管理预处理器指令,如#include和#define

«#include“file”»只需获取指定的文件并将代码行注入正在编译的代码中。也就是说,它是纯粹的、简单的文本替换。 在本例中,您正在test.c中定义一个函数,并且可能在主.c文件中添加了#include“test.c”。因此,预处理器获取文件“test.c”,并将预处理器指令(#include“test.c”)替换为文件“test.c”中的文本

这样,您最终将在main.c文件中定义函数,因为编译器看到的内容也包含函数定义。 您可以通过在某个文件夹中编译,然后将可执行文件移动到另一个位置并执行程序来测试这一点。它执行得很好,因为您执行了类似于函数静态链接的操作:代码在编译时被注入到main.c文件中

现在,头文件: 头文件只是声明方法头(有时称为原型)的文件,但实际上它们不一定实现。 实现(实际编译的机器代码)位于另一个文件中:一个(可能共享的)库。 因此,基本上,包含头文件可以让编译器知道有一组声明的元素(函数、常量等),但它们是在其他地方实现/定义的。这允许程序成功编译(如果使用-libxyz选项导入所需的库,或者默认情况下导入,例如stdio),因为它知道您在main.c文件中使用的元素是在某个地方定义的。这使得库可以动态或静态地链接到程序


因此,文件的扩展名或类型基本上是不相关的。显然,您可以包含许多文件,并且行为类似,但我认为在为您的程序创建库的情况下需要这些文件。

是否在main.c中包含test.c?不需要头文件。编译器没有头的概念,只有代码。谢谢你的回答,但我的问题是我甚至没有将test.c文件(#include test.c)包含到我的主.c文件中。这就是困扰我的原因。这很奇怪。我自己也尝试过这样做,但除非我包含test.c fileWell,否则它不会编译。通常情况下,函数在默认情况下是全局的(项目中的所有文件都可以访问),除非它们是静态的。同样在我的例子中,如果我将.c文件和我正在使用的函数包含到我的主.c文件中,编译器会引发一个错误(“我正在使用的函数”的多个定义)这是因为所有的.c文件都已编译,但当我将.c文件包含到main.c中时,它会将所有代码从第一个文件复制并粘贴到另一个文件中,因此它会首先读取main.c文件中的函数,然后指出相同的函数写在另一个.c文件中。@SaadJlil:这是关于惹你生气?然后创建一个(新的)问题,包括。在这一点上,我猜想您正在查看一个隐式声明(您调用的函数是
inttest(void)
或兼容的),并且您没有启用编译器警告,或者没有注意它们。但这是猜测,最好在查看实际代码时回答。