• 通宝娱乐tb777|通宝娱乐tb777唯一授权官网

  • 发布时间:2016-01-20 06:07 | 作者:yc | 来源:互联网 | 浏览:1200 次
  • 通宝娱乐tb777|通宝娱乐tb777唯一授权官网

    把稳:注解预处置惩罚到体系规矩的道路中去取得这个文件,而 "" 则注解预处置惩罚应在当前目录中查找文件名为 stdio.h 的文件,若没有找到,则按体系指定的道路信息,查找其余目录

    从源代码(.c)到可实行文件统共分为五个进程:

    1、编译预处置惩罚

    2、编译时代

    3、优化时代

    4、汇编进程

    5、链接法度榜样

    一、编译预处置惩罚(.i) ------>"代替"成一个没有宏界说、没有前提编译指令、没有特殊符号的输出文件

    读取c源法度榜样,对其间的伪指令(以#最初的指令)和特殊符号进行处置惩罚伪指令重要包孕以下四个方面:

    (1)宏界说指令

    如:#define M 9 、#define SQUARE(x) ((x)*(x)) 、#undef(撤销宏界说),宏平日都是大年夜写(以差异函数)把稳:作为字符串的常量则不被替换

    #define M 9

    int main()

    {

    a=M;

    printf("M=%d",a);

    //printf("M=%d",9);

    }

    #define SQUARE(x) ((x)*(x))

    // x * x

    int main()

    {

    int a=4;

    printf("%d\n",SQURE(a+1));

    //printf("%d\n",((4+1)*(4+1)));

    //printf("%d\n",4+1 * 4+1);

    }

    把稳:参数列表的左括号有需要与SQUARE紧邻、不能小气括号,不然会出现核算逻辑的疑问

    (2)前提编译指令

    如:#ifdef,#ifndef,#else,#elif,#endif,等等这些伪指令使得法度榜样员能够经由过程界说不一样的宏来决定编译法度榜样对哪些代码进行处置惩罚(过滤效果),可防止重复仿制代码

    #ifdef 标识符

    法度榜样段 1

    #else

    法度榜样段 2

    #endif

    它的功能是,要是标识符已被 #define 指令界说过则对法度榜样段 1 进行编译;不然对法度榜样段 2 进行编译

    (3)头文件包孕指令

    如:#include 、#include "stdio.h"等等#include 是将已存在文件的内容仿制到当前文件中,它能够使某些界说能够供多个不一样的C源法度榜样运用,只需加上一条#include句子 ,预编译就会自个把头文件中的界说通通都加入到它所发生的输出文件中,以供编译,而不必法度榜样员再行界说

    (4)特www.yuojizz.com殊符号

    比方一些预界说符号__FILE__(注解正在编译的文件的姓名)、 __TIME__(注解编译光阴的光阴字符串)、 __LINE__(注解正在编译的文件的行号)、 __DATE__(注解编译光阴的日期字符串)、 __STDC__(判别该文件是不是界说成规范 C 法度榜样),预编译法度榜样关于在源法度榜样中出现的这些串将用合适的值进行替换

    printf ("file:%s\tline:%d\tdate:%s\ttime:%s\n",__FILE__,__LINE__, __DATE__,__TIME__ );

    # 运算符 和 ## 核算符

    a、要是咱们期望在字符串中包孕宏参数,那咱们就能够运用“#”,它能够把言语符号转化为字符串

    #include

    #define SQR(x) printf("The square of "#x" is %d.\n",((x)*(x)))

    int main()

    {

    SQR(8);

    }

    运转结果是:The square of 8 is 64.

    b、“##”等于个粘合剂,能够将前后两部分粘合起来

    通宝娱乐tb777|通宝娱乐tb777唯一授权官网

    #include

    #define XNAME(n) x ## n

    int main()

    {

    XNAME(8) ;

    }

    运转结果是:x8

    二、编译时代(.s) -------> 翻译成等价的中心代码注解或汇编代码

    通宝娱乐tb777|通宝娱乐tb777唯一授权官网经由过程预编译获得的输出文件中,将只要常量

    如:数字、字符串、变量的界说,以及C言语的关键词(main,if,else,for,while,{,},+,-,*,\)等等

    预编译法度榜样,所要作的功课等于经由过程词法剖析、语义剖析、符号汇总和语法剖析,在承认统统的指令都契合语律例矩今后,将其翻译成等价的中心代码注解或汇编代码

    三、优化时代(实行的功率的进步)

    (1)对中心代码的优化

    (2)与机械的硬件构造有关,比方:运用机械的各个硬件寄存器寄存的有关变量的值,减少关于内存的拜访次数等等

    四、汇编进程(.o) ------> 天生响应的方针文件

    汇编进程对汇编器对照简单,汇编器只需将汇编代码改变成机械能够实行的指令,每一个汇编都有一条对应的机械指令,它没有紊乱的语法也没有语义,也不需求指令优化,只是对比机械指令和汇编指令的对比表逐个翻译

    方针bet98,com文件中所寄存的是与源法度榜样等效的方针的机械言语代码

    方针文件由段构成一个方针文件中至少有两个段:

    代码段重要包孕的是法度榜样的指令该段平日是可读、可实行、弗成写

    数据段重要寄存法度榜样中的全局变量或静态的数据平日数据段都是可读、可实行、可写

    五、链接法度榜样 -------> 将有关的方针文件相互相连接

    由汇编法度榜样天生的方针文件并不能当即就被实行,其间大概还有很多没有办理的疑问,比方函数调用、模块间的变量拜访

    链接包孕:地址和空间分配、重定位、符号决定

    重定位:要是有一个全局变量叫var,在方针文件 A 里,而方针文件 B 里面要运用var变量,咱们编译方针文件 B ,由于在编译的时分编译器找不到var的地址,编译器在无法断定地址的环境下就将地址置为0,当链接器将 A 和 B 链接后,变量var的地址会断定下来,链接器将会修正地址,这地址修正的进程就称作重定位

    链接处置惩罚分为两种:

    (1)静态链接,等于函数的代码将从静态链接库中被拷贝到可实行法度榜样中(静态链接库实际上是一个方针文件的召集,其间的每个文件富含库中的一个或许一组有关函数的代码),但这么使得可实行法度榜样体积变大年夜

    (2)动态链接,等于需求链接的代码放到一个同享目标中,链接法度榜样只用纪录可实行法度榜样将来需求用的代码信息,在可实行文件被实行时,动态链接库的整个内容将被映射到运转时响应进程的虚地址空间, 动态链接法度榜样将依据可实行法度榜样中纪录的信息找到响应的函数代码 比静态链接节省内存

    经由过程上述五个进程,C源法度榜样就毕竟被转换成可实行文件了

  • 相关内容

友情链接: