C语言基础

    返回首页    发表留言
本文作者:李德强
          第一节 包含头文件
 
 

        在多文件编译一节中我们已经学习了关于源文件和头文件的基本知识。今天我们来仔细学习一下关于这方面的知识。
        在编写程序时,我们在用到一些库函数,比如printf和scanf时,需要在源代码的最上方引入它们的声明文件,也就是
                #include <stdito.h>
        在stdio.h这个头文件中,声明了printf函数和scanf函数的形式,并允许其它程序调用。
        同样我们在使用malloc函数和free函数时也要在源代码上包含它们的声明文件:
                #include <stdlib.h>
        还有,我们在使用C语言的库函数时需要引入它们的相应头文件,再如,我们使用内存设值memset函数和内存复制memcpy函数时需要引入:
                #include <string.h>
        那么,包含这些头文件的本质是什么呢?这要从编译器的编译过程说起。编译器在编译C语言程序时其实是分为三个步骤。
        第一步:预编译。在预编译时将所有的源代码预编译成一个总的源代码文件。比如,我们在hello.c中包含了stdio.h这个头文件时,预编译就是把stdio.h中的内容和hello.c中的内容全部复制到一个文件里,这里面即包含了stdio.h中的所有内容,也包含了hello.c中的全部内容。另外,在预编译时还会将所有的宏展开,生成实际代码。关于宏的相关内容我们会在下一节中学习。

        第二步:编译目标程序。此时会将在第一步中生成的总源代码文件编译成目标程序。这里的目标程序通常是以.o结尾,其中包含了程序中的数据段、代码段。并且有所有的功能函数的定义与实现。
        第三步:编译可执行程序。此时会将在第二步中生成的目标文件与依赖的库函数一起编译成可执行程序。其实就是将目标程序解释成可以被计算机所执行的机器码。在编译时编译器会根据编译选项,将C语言和函数库文件或是系统中的动态链接库与程序编译在一起。例如,在使用数学函数sin和cos函数时,除了要包含math.h头文件之外,还需要为编译器指定编译选项 -lm 即将数学库函数一起编译到目标程序中。
        我们可以用一种图形化的办法来描述一下这三个步骤:

    
        其实,编译器将源代码编译成目标文件时,整个过程比我们上面讲的内容复杂的多。例如编译器会对源代码做词法分析和语法分析等等。有兴趣的读者可以自己参阅相关书籍。关于编译原理并不是我们本系列文章的重点,不再赘述。

 

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号