如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
GCC编译的背后平时在Linux下写代码,直接用"gcc-ooutin.c"就把代码编译好了,但是这后面到底做了什么事情呢?如果学习过编译原理则不难理解,一般高级语言程序编译的过程莫过于:预处理、编译、汇编、链接。gcc在后台实际上也经历了这几个过程,我们可以通过-v参数查看它的编译细节,如果想看某个具体的编译过程,则可以分别使用-E,-S,-c和-O,对应的后台工具则分别为cpp,cc1,as,ld。下面我们将逐步分析这几个过程以及相关的内容,诸如语法检查、代码调试、汇编语言等。1、预处理开篇简述:预处理是C语言程序从源代码变成可执行程序的第一步,主要是C语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。以前没怎么“深入”预处理,脑子对这些东西总是很模糊,只记得在编译的基本过程(词法分析、语法分析)之前还需要对源代码中的宏定义、文件包含、条件编译等命令进行处理。这三类的指令很常见,主要有#define,#include和#ifdef...#endif,要特别地注意它们的用法。(更多预处理的指令请查阅相关资料)#define除了可以独立使用以便灵活设置一些参数外,还常常和#ifdef...#endif结合使用,以便灵活地控制代码块的编译与否,也可以用来避免同一个头文件的多次包含。关于#include貌似比较简单,通过man找到某个函数的头文件,copy进去,加上<>就okay。这里虽然只关心一些技巧,不过预处理还是蕴含着很多潜在的陷阱(可参考<CTraps&Pitfalls>),我们也需要注意的。下面仅介绍和预处理相关的几个简单内容。打印出预处理之后的结果:gcc-Ehello.c这样我们就可以看到源代码中的各种预处理命令是如何被解释的,从而方便理解和查错。实际上gcc在这里是调用了cpp的(虽然我们通过gcc的-v仅看到cc1),cpp即TheCPreprocessor,主要用来预处理宏定义、文件包含、条件编译等。下面介绍它的一个比较重要的选项-D。在命令行定义宏:gcc-Dmacrohello.c这个等同于在文件的开头定义宏,即#definemaco,但是在命令行定义更灵活。例如,在源代码中有这些语句。#ifdefDEBUGprintf("thiscodeisfordebugging\n");#endif如果编译时加上-DDEBUG选项,那么编译器就会把printf所在的行编译进目标代码,从而方便地跟踪该位置的某些程序状态。这样-DDEBUG就可以当作一个调试开关,编译时加上它就可以用来打印调试信息,发布时则可以通过去掉该编译选项把调试信息去掉。本节参考资料:[1]C语言教程第九章:预处理HYPERLINK"http://www.bc-cn.net/Article/kfyy/cyy/jc/200409/9.html"\t"_blank"http://www.bc-cn.net/Article/kfyy/cyy/jc/200409/9.html[2]更多HYPERLINK"http://www.hemee.com/kfyy/c/6626.html"\t"_blank"http://www.hemee.com/kfyy/c/6626.htmlHYPERLINK"http://www.91linux.com/html/article/program/cpp/20071203/8745.html"\t"_blank"http://www.91linux.com/html/article/program/cpp/20071203/8745.htmlHYPERLINK"http://www.janker.org/bbs/programmer/2006-10-13/327.html"\t"_blank"http://www.janker.org/bbs/programmer/2006-10-13/327.html2、编译(翻译)开篇简要:编译之前,C语言编译器会进行词法分析、语法分析(-fsyntax-only),接着会把源代码翻译成中间语言,即汇编语言。如果想看到这个中间结果,可以用-S选项。需要提到的是,诸如shell等解释语言也会经历一个词法分析和语法分析的阶段,不过之后并不会进行“翻译”,而是“解释”,边解释边执行。把源代码翻译成汇编语言,实际上是编译的整个过程中的第一个阶段,之后的阶段和汇编语言的开发过程没有什么区别。这个阶段涉及到对源代码的词法分析、语法检查(通过-std指定遵循哪个标准),并根据优化(-O)要求进行翻译成汇编语言的动作。如果仅仅希望进行语法检查,可以用-fsyntax-only选项;而为了使代码有比较好的移植性,避免使用gcc的一些特性,