c语言 gcc编译过程,C语言之1- gcc编译过程与原理

一.关于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的错误类型及对策

a4c26d1e5885305701be709a3d33442f.png

7. GCC的选项

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

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

-g:调试选项

-O:优化编译、链接

二.gcc编译过程

a4c26d1e5885305701be709a3d33442f.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

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

a4c26d1e5885305701be709a3d33442f.png

2) 文件包含:#include

将文件包含到文件中来。

3) 条件编译:#if 、#ifdef

、#ifndef、#else、#endif

3. 宏定义

1) 说明

a.

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

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

2) 预定义符号:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

3) 不带参数的宏定义

#define 标识符 字符串

其中:

#是预处理命令标记。

define是宏定义命令。

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

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

a4c26d1e5885305701be709a3d33442f.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

只能有一道程序被编译;

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

a4c26d1e5885305701be709a3d33442f.png

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

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

程序1

#else

程序2

#endif

c.

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

#if 常量表达式

程序1

#else

程序2

#endif

a4c26d1e5885305701be709a3d33442f.png

四.编译

1.

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

a4c26d1e5885305701be709a3d33442f.png

2. 多文件编译

a4c26d1e5885305701be709a3d33442f.png

你可能感兴趣的:(c语言,gcc编译过程)