Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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源文件_C_Include - Fatal编程技术网

C-如何在没有包含语句的情况下包含C源文件

C-如何在没有包含语句的情况下包含C源文件,c,include,C,Include,我已经下了决心,正在学习C语言。这是一个非常好但易于管理的学习过程,它来自一个脚本(php、perl)背景,只有一点点C语言 我已经使用了网站“艰苦学习C”,到目前为止我掌握得相当好(我想),但我无法理解其中一个练习的这一部分: 他创建了四个源文件——object.h、object.c、ex19.h、ex19.c 但是我不明白object.c文件是如何包含的 主函数位于ex19.c中,它具有 #include "ex19.h" #include "object.h" #include "o

我已经下了决心,正在学习C语言。这是一个非常好但易于管理的学习过程,它来自一个脚本(php、perl)背景,只有一点点C语言

我已经使用了网站“艰苦学习C”,到目前为止我掌握得相当好(我想),但我无法理解其中一个练习的这一部分:

他创建了四个源文件——object.h、object.c、ex19.h、ex19.c

但是我不明白object.c文件是如何包含的

主函数位于ex19.c中,它具有

#include "ex19.h"
#include "object.h"
#include "object.h"
文件ex19.h有一行

#include "ex19.h"
#include "object.h"
#include "object.h"
但是object.h没有提及包含object.c。有趣的是,object.c包含这一行

#include "ex19.h"
#include "object.h"
#include "object.h"

是否存在某种隐含的包含,如果包含头文件,它将自动包含同名的c源代码?

这是一个称为链接器的单独程序的工作。在C中,源文件需要访问其他C源文件的头文件,以便它们可以查看关于第一个文件可能要使用的第二个C文件定义了哪些函数、类型和变量的信息。然后,每个C文件独立于其余文件进行编译。编译器的输出是一个对象文件

为了构建最终的程序,第二个程序称为链接器,它将所有对象文件合并到整个可执行文件中。该程序的任务是获取所有不同C文件的实现,并相互交叉引用,以便每次一个C文件引用不同C文件中的函数或变量时,该引用实际上可以引用到相应的对象

这就是为什么不需要包含
.c
文件的原因。一旦一个源文件有了一个头文件,它就对另一个文件有足够的了解,以便使用它为编译器提供的函数来验证它是否正确使用它们。然后,链接器处理实际进行交叉引用的工作。您可以将编译器视为一个程序,它检查函数是否已定义,然后程序是否可以工作。然后链接器实际检查以确保首先定义了这些函数,并在可执行文件中设置了适当的链接


希望这有帮助

Object.c不包括在内

它被编译为自己的单元,包括object.h

请参见make文件:

CFLAGS=-Wall -g

all: ex19

ex19: object.o

clean:
  rm -f ex19
ex19:object.o
告诉您必须先创建object.o,然后才能生成ex19,默认情况下,这是在对象.c存在时从make文件中获取的

所以这个文件说

要构建所有需要的ex19,要获取ex19,需要object.o,而要创建object.o,makefile将获取从object.c构建的object.o

从您引用的页面:

make无法在object.o的文件中看到任何内容,但它确实看到 object.c文件,它知道如何将.c转换为.o,它确实知道 那个


整个逻辑都在makefile和智能编译器中。创建的最后一个二进制文件有一个名为object.o的对象文件,理想情况下,该文件将包含object.h文件中定义的所有函数定义。正是链接器将.h文件中声明的函数与.o文件中可用的定义链接起来。

非常好,这很有意义。链接器程序是C编译器的一部分吗?通常C编译器完成编译的所有阶段——预处理、编译、优化和链接。大多数编译器都有命令行开关,您可以使用它来执行其中一个阶段,看到结果通常是很有趣的。