C-如何在没有包含语句的情况下包含C源文件
我已经下了决心,正在学习C语言。这是一个非常好但易于管理的学习过程,它来自一个脚本(php、perl)背景,只有一点点C语言 我已经使用了网站“艰苦学习C”,到目前为止我掌握得相当好(我想),但我无法理解其中一个练习的这一部分: 他创建了四个源文件——object.h、object.c、ex19.h、ex19.c 但是我不明白object.c文件是如何包含的 主函数位于ex19.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
#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编译器完成编译的所有阶段——预处理、编译、优化和链接。大多数编译器都有命令行开关,您可以使用它来执行其中一个阶段,看到结果通常是很有趣的。