一.关于gcc
1.全称GUN CC ,GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。
2.gcc虽然被认为是最遵守C语言标准的编译器之一,但是它并不是严格按照ISO C标准规定的方式来实现的。
3.gcc的实现方式采取了这样的策略:最大限度地遵守标准的规定,同时从实用的角度做自己的扩展。
4.当然,gcc提供了编译选项给使用者以决定是否使用这些扩展功能。
5.gcc的功能扩展分为两种,一种是gnu自己定义的语言扩展;另外一种扩展是在C89模式中引入由C99标准定义的C语言特性。
6.Gcc的错误类型及对策
7.GCC的选项
-c:只编译不连接,生成.o文件
-o:确定输出文件名称,后接输出文件;
-g:调试选项
-O:优化编译、链接
二.gcc编译过程
1.预处理
执行:Gcc text.c –E –o text.i
作用:1、将文件包含进行展开;2、对宏进行定义;3、进行条件编译。
C语言对空格和空行不敏感,在预处理时会去掉空格和空行;(程序代码中)
2.编译
执行:Gcc text.i –S –o text.s
作用:将C语言程序编译成汇编程序(里面是汇编程序)
3.汇编
执行:Gcc text.s –C –o text.o
作用:将汇编文件编译成二进制文件
4.链接
执行:Gcc text.o –o text
作用:调用链接器ld,将生成的可重定位文件与相关库文件链接,生成可执行文件。
Gcc text.c -o text
三.预处理
1.概念
1)所谓预处理就是进行编译的第一遍扫描(词法扫描和语法扫描)之前所做的工作。
2)预处理是所有以“#”开头的预处理指令。
3)预处理在程序运行时不需要消耗时间。
2.C提供的预处理功能有:
1)宏定义:#define
完全的字符串替换,多用括号括起来,避免调用出错。如:
2)文件包含:#include
将文件包含到文件中来。
3)条件编译:#if 、#ifdef 、#ifndef、#else、#endif
3.宏定义
1)说明
a.宏定义用大写字母表示,也允许用小写字母表示。
b.宏定义不是声明或语句,行末不必加分号。
2)预定义符号:
3)不带参数的宏定义
#define 标识符 字符串
其中:
#是预处理命令标记。
define是宏定义命令。
标识符即为宏定义的宏名。
字符串可以是常量、表达式、格式串等。
4)带参数的宏定义
#define 宏名(参数表) 字符串
a.两个原则:1、尽量多用括号;2、不要用自加自减。
b.宏名与参数表间没有空格;以空格为分隔符,作为替换标志。
c.字符串中的参数用过用括号括起来。
如:#define MAX(a,b) ((a>b)?(a):(b))
宏名与参数表之间没有空格。
形参不分配内存单元。
4.文件包含
1)说明
a.尖括号表示在系统头文件目录中查找,双引号表示在当前目录中查找,若找不到再到系统头文件目录中找。
5.条件编译
1)说明
a.条件编译功能使我们能按不同的条件编译出不同的代码。条件不满足的代码将不会被编译。
b.条件编译能防止头文件重复包含,在编译时就处理。
2)三种定义的形式
a.第一种
#ifdef 标识符//判断标识符是否已经定义
程序1
#else
程序2
#endif
只能有一道程序被编译;
第一第二种一般用于文件的开头
b.第二种:常用于调试,代码很长时,方便于调试
#ifndef 标识符//判断标识符是否已经定义
程序1
#else
程序2
#endif
c.第三种:常用于注释,这样预编译时就会去掉这注释的代码,当代码很长时,可以用这种方法注释,进行代码调试
#if 常量表达式
程序1
#else
程序2
#endif
四.编译
1.在编译时定义宏(加上-D选项)
2.多文件编译