本章大纲
一、程序实现需要经过的两种环境
1)翻译环境
实际开发中是分模块开发,每个人负责自己的模块,所以会有很多个.c文件。
每个源文件都会单独经过编译器生成自己的目标文件(windows环境下是 .obj文件)
linux环境下 gcc编译器编译后生成的 目标文件是.o 文件
多个目标文件+链接库通过链接器来生成可执行程序文件(.exe文件)。
所以.c程序会经过两个程序生成可执行程序,一个是编译器,一个是链接器。
vs环境下的编译器是cl.exe 链接器是 link.exe
预处理阶段(文本操作):
1、头文件的内容会包含 #include
2、#define 定义符号的替换 并删除原来定义的#define
3、注释删除
2)程序的运行环境:
二、预处理详解
define
define定义标识符
define 定义宏
宏只完成替换
#和##
##
代码实现:
带有副作用的宏参数
函数与宏的对比:
宏的优点
宏缺点:
对比总结:
宏缺陷:
当参数内有操作符和宏内也有操作符会产生优先级顺序。
解决方式:
命名习惯:
取消define指令 #undef
条件编译:
文件包含:
头文件多次包含则会在编译时,多次重复合并头文件代码,造成代码冗余。
解决办法:
1、头文件内开头先用宏定义。(通用)
2、#pragma once 指令(新编译器支持,老版本编译器不支持)
包含库的时候 <> 和" " 的区别
offsetof(计算结构体变量相较于它起始位置的偏移量)
实现方法:
偏移量是相对于起始地址为0位置的实际位置数。假设起始位置是0,标号4的位置,就是偏移量4的元素的首地址。
思想:把ox00000000地址作为起始地址 表示为结构体的起始地址。然后用->引出结构体成员,并取地址后强制转换为(size_t)类型,可以得到成员相对于起始地址的偏移量。
补充:
续行符