一.关于gcc

1.全称GUN CC GNU计划,又称革奴计划,是由Richard Stallman1983927公开发起的。它的目标是创建一套完全自由的操作系统。

2.gcc虽然被认为是最遵守C语言标准的编译器之一,但是它并不是严格按照ISO C标准规定的方式来实现的。

3.gcc的实现方式采取了这样的策略:最大限度地遵守标准的规定,同时从实用的角度做自己的扩展。

4.当然,gcc提供了编译选项给使用者以决定是否使用这些扩展功能。

5.gcc的功能扩展分为两种,一种是gnu自己定义的语言扩展;另外一种扩展是在C89模式中引入由C99标准定义的C语言特性。

6.Gcc的错误类型及对策

    220401250.png

 

7.GCC的选项

-c:只编译不连接,生成.o文件

-o:确定输出文件名称,后接输出文件;

-g:调试选项

-O:优化编译、链接

 

二.gcc编译过程

      220506260.png

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

完全的字符串替换,多用括号括起来,避免调用出错。如:

220609614.png

2)文件包含:#include

将文件包含到文件中来。

3)条件编译:#if #ifdef #ifndef#else#endif

3.宏定义

1)说明

a.宏定义用大写字母表示,也允许用小写字母表示。

b.宏定义不是声明或语句,行末不必加分号。

2)预定义符号:

                220659176.png

                220659321.png

 

3)不带参数的宏定义

#define 标识符 字符串

其中:

#是预处理命令标记。

define是宏定义命令。

标识符即为宏定义的宏名。

字符串可以是常量、表达式、格式串等。

220838160.png

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

只能有一道程序被编译;

第一第二种一般用于文件的开头

    220945297.png

b.第二种:常用于调试,代码很长时,方便于调试

#ifndef 标识符//判断标识符是否已经定义

程序1

#else

程序2

#endif

c.第三种常用于注释,这样预编译时就会去掉这注释的代码,当代码很长时,可以用这种方法注释,进行代码调试

#if 常量表达式

程序1

#else

程序2

#endif

221036615.png

四.编译

1.在编译时定义宏(加上-D选项)

    221100766.png

2.多文件编译    

    221115196.png