c程序进阶-程序环境和预处理

本章大纲

c程序进阶-程序环境和预处理_第1张图片

一、程序实现需要经过的两种环境

 c程序进阶-程序环境和预处理_第2张图片

1)翻译环境

c程序进阶-程序环境和预处理_第3张图片c程序进阶-程序环境和预处理_第4张图片

实际开发中是分模块开发,每个人负责自己的模块,所以会有很多个.c文件。 

每个源文件都会单独经过编译器生成自己的目标文件(windows环境下是 .obj文件

linux环境下  gcc编译器编译后生成的 目标文件是.o  文件

多个目标文件+链接库通过链接器来生成可执行程序文件(.exe文件)。

所以.c程序会经过两个程序生成可执行程序,一个是编译器,一个是链接器。

vs环境下的编译器是cl.exe    链接器是 link.exe

c程序进阶-程序环境和预处理_第5张图片

 预处理阶段(文本操作):

1、头文件的内容会包含 #include

2、#define 定义符号的替换  并删除原来定义的#define

3、注释删除

c程序进阶-程序环境和预处理_第6张图片

2)程序的运行环境:

c程序进阶-程序环境和预处理_第7张图片

二、预处理详解

c程序进阶-程序环境和预处理_第8张图片

 define

define定义标识符

c程序进阶-程序环境和预处理_第9张图片

define 定义宏

c程序进阶-程序环境和预处理_第10张图片

 c程序进阶-程序环境和预处理_第11张图片

宏只完成替换

c程序进阶-程序环境和预处理_第12张图片

#和##

c程序进阶-程序环境和预处理_第13张图片

 c程序进阶-程序环境和预处理_第14张图片

##

c程序进阶-程序环境和预处理_第15张图片

代码实现:

c程序进阶-程序环境和预处理_第16张图片

带有副作用的宏参数

c程序进阶-程序环境和预处理_第17张图片

c程序进阶-程序环境和预处理_第18张图片

 函数与宏的对比:

宏的优点

c程序进阶-程序环境和预处理_第19张图片

 宏缺点:

c程序进阶-程序环境和预处理_第20张图片

对比总结:

c程序进阶-程序环境和预处理_第21张图片

 c程序进阶-程序环境和预处理_第22张图片

宏缺陷:

当参数内有操作符和宏内也有操作符会产生优先级顺序。

c程序进阶-程序环境和预处理_第23张图片

 解决方式:

c程序进阶-程序环境和预处理_第24张图片

命名习惯:

c程序进阶-程序环境和预处理_第25张图片

取消define指令     #undef

c程序进阶-程序环境和预处理_第26张图片

c程序进阶-程序环境和预处理_第27张图片

条件编译:

c程序进阶-程序环境和预处理_第28张图片

 c程序进阶-程序环境和预处理_第29张图片

 c程序进阶-程序环境和预处理_第30张图片

 c程序进阶-程序环境和预处理_第31张图片

 c程序进阶-程序环境和预处理_第32张图片

文件包含:

 头文件多次包含则会在编译时,多次重复合并头文件代码,造成代码冗余。

c程序进阶-程序环境和预处理_第33张图片c程序进阶-程序环境和预处理_第34张图片

解决办法:

1、头文件内开头先用宏定义。(通用)

c程序进阶-程序环境和预处理_第35张图片

 2、#pragma once 指令(新编译器支持,老版本编译器不支持)

c程序进阶-程序环境和预处理_第36张图片

c程序进阶-程序环境和预处理_第37张图片

包含库的时候 <> 和" " 的区别

c程序进阶-程序环境和预处理_第38张图片

c程序进阶-程序环境和预处理_第39张图片

offsetof(计算结构体变量相较于它起始位置的偏移量)

实现方法:

偏移量是相对于起始地址为0位置的实际位置数。假设起始位置是0,标号4的位置,就是偏移量4的元素的首地址。

c程序进阶-程序环境和预处理_第40张图片

 思想:把ox00000000地址作为起始地址  表示为结构体的起始地址。然后用->引出结构体成员,并取地址后强制转换为(size_t)类型,可以得到成员相对于起始地址的偏移量。

c程序进阶-程序环境和预处理_第41张图片

 

补充:

续行符

c程序进阶-程序环境和预处理_第42张图片

你可能感兴趣的:(c语言)