Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 - Fatal编程技术网

为什么我们要在C中包含头文件

为什么我们要在C中包含头文件,c,C,为什么我们要在C中包含头文件 我无法理解在C语言中添加头文件的必要性。我的意思是,如果我不使用头文件,将会发生什么情况实际上不需要使用头文件。它们避免了在每个源文件中包含所有正在使用的函数的定义。头文件只不过是在使用include的位置插入它们的内容。如果您愿意,您可以自己编写所有这些内容。实际上不需要使用它们。它们避免了在每个源文件中包含所有正在使用的函数的定义。头文件只不过是在使用include的位置插入它们的内容。如果愿意,您可以自己编写所有这些内容。来自其他头文件的声明在该文件中不可见,

为什么我们要在C中包含头文件


我无法理解在C语言中添加头文件的必要性。我的意思是,如果我不使用头文件,将会发生什么情况

实际上不需要使用头文件。它们避免了在每个源文件中包含所有正在使用的函数的定义。头文件只不过是在使用include的位置插入它们的内容。如果您愿意,您可以自己编写所有这些内容。

实际上不需要使用它们。它们避免了在每个源文件中包含所有正在使用的函数的定义。头文件只不过是在使用include的位置插入它们的内容。如果愿意,您可以自己编写所有这些内容。

来自其他头文件的声明在该文件中不可见,除非您包含头文件或提供完全相同的声明副本


使用头文件是最简单的读取方法:在源文件中使用另一个程序的唯一合理方法。通过包含,您可以指示编译器读取文件内容,以便您可以轻松使用该文件中的任何内容。

来自其他头文件的声明在该文件中将不可见,除非您包含头文件或提供完全相同的声明副本


使用头文件是最简单的读取方法:在源文件中使用另一个程序的唯一合理方法。通过包含,您可以指示编译器读取文件的内容,以便您可以轻松使用该文件中的任何内容。

大型项目被编译为对象文件.o,然后链接到一个二进制文件中


这意味着在编译时,如果您访问位于另一个对象文件中的函数,编译器不知道这些函数,因此通过包含.h文件,您可以声明链接时可用的函数,因此,编译相信它们会在那里,而不会引起关于缺少函数的错误。

大型项目被编译成对象文件.o,然后在一个二进制文件中链接在一起

这意味着,在编译时,如果您访问位于另一个对象文件中的函数,编译器将不知道这些函数,因此通过包含.h文件,您可以声明链接时可用的函数,因此编译器相信这些函数将在那里,而不会引发有关缺少函数的错误。

Wikipedia:

头文件是一个允许程序员分离某些文件的文件 将程序源代码的元素转换为可重用文件。头文件 通常包含类、子例程、, 变量和其他标识符。希望声明 多个源文件中的标准化标识符可以放置这样的文件 单个头文件中的标识符,其他代码可以包括这些标识符 每当需要标题内容时。这是为了保持 标头中与实现分离的接口

维基百科:

头文件是一个允许程序员分离某些文件的文件 将程序源代码的元素转换为可重用文件。头文件 通常包含类、子例程、, 变量和其他标识符。希望声明 多个源文件中的标准化标识符可以放置这样的文件 单个头文件中的标识符,其他代码可以包括这些标识符 每当需要标题内容时。这是为了保持 标头中与实现分离的接口


计算机本身无法发现任何东西。这只是我们告诉它做什么[程序]。我们包含的文件也在做同样的事情,它给出了我们在程序中使用的命令的基本概念,以及如何使其工作。这些信息存在于包含的文件中

计算机本身无法发现任何东西。这只是我们告诉它做什么[程序]。我们包含的文件也在做同样的事情,它给出了我们在程序中使用的命令的基本概念,以及如何使其工作。这些信息存在于包含的文件中

它最初是交叉递归的编译问题:

void foo() {
  //bar? what is this function???
  bar();
}

void bar() {
  //I know foo() because it appears before. 
  foo();
}
foo只能在之前定义了bar的情况下调用它。 只有在之前定义了foo时,bar才能调用foo 那么我们首先定义哪一个呢

为了解决这个问题,原型应运而生

然后将原型收集到a.h文件中


然后,它成为了一种良好的做法,因为它将接口与实现分离。

它最初是交叉递归的编译问题:

void foo() {
  //bar? what is this function???
  bar();
}

void bar() {
  //I know foo() because it appears before. 
  foo();
}
foo只能在之前定义了bar的情况下调用它。 只有在之前定义了foo时,bar才能调用foo 那么我们首先定义哪一个呢

为了解决这个问题,原型应运而生

然后将原型收集到a.h文件中


然后,它成为了一种良好的实践,因为它将接口与实现分离。

它对于层次结构设计非常有用。你可以用你自己写c

当你需要相同的代码时,你需要复制或重写它。有了“头”,我们可以将系统的不同部分分别写入头中,然后我们可以测试或重用它。

这对层次结构设计很有用。您可以编写没有标题的c,然后您会看到每个源文件都变得太大,无法理解或使用,当您需要相同的代码时,您需要复制或重写它。使用“标题”,我们可以将系统的不同部分分别写入标题,然后我们可以测试或重用它。

好资源,希望OP也能学会使用它+1很好的资源,希望OP也能学会使用它+1抱歉,但头文件并非主要用于此目的。您可以直接包含另一个.c,只要您没有交叉递归的问题,它就可以工作。请检查我的答案以了解更多解释。但我承认,在大多数情况下,包括另一个。c是一个非常糟糕的做法。当然它会起作用。。。它还需要更多的编译时间,因为它将重新编译所有内容,而不仅仅是已更改的文件。抱歉,头文件并不是主要用于此目的。您可以直接包含另一个.c,只要您没有交叉递归的问题,它就可以工作。请检查我的答案以了解更多解释。但我承认,在大多数情况下,包括另一个。c是一个非常糟糕的做法。当然它会起作用。。。它还需要更多的编译时间,因为它将重新编译所有内容,而不仅仅是已更改的文件。如果使用交叉递归,它们实际上很有用。正如您的答案所述,您可以像在头文件中那样写出函数原型。除了理智之外,仍然没有实际需要使用它们。这是真的,我同意。如果使用交叉递归,它们实际上是有用的。好吧,正如你的回答所述,你可以像在头文件中那样写出函数原型。除了理智之外,仍然没有实际需要使用它们。这是真的,我同意。我只是使用这个网站,因为我想做一个与我的项目类似的网站。请不要投票否决我我喜欢层次结构。他们把我送进。。。休眠。我使用这个网站是因为我想创建一个与我的项目类似的网站。请不要投票否决我我喜欢层次结构。他们把我送进。。。冬眠,很好的例子!很好的例子!