1、甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第十三章 编译预处理和动态存储分配甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽*甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理编译预处理: C编译程序对 C源程序进行编译之前,由编译预处理程序对编译预处理命令进行处理的过程C语言中,凡是以 “#”开头的行,都称为 “编译预处理 ”命令行,每行的末尾不得用 “; ”号结束,以区别于 C语言中的语句、定义和说明语句。它们可以出现在程序的任何一行的开始位置,作用域是从出现点到本文件末尾。Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽
2、第一节 编译预处理C语言的预处理命令有:#define、 #undef、 #include、 #if、#else、 #elif、 #endif、 #ifdef、#ifndef、 #line、 #pragma、 #error。本章将重点介绍 #define和 #include命令行的应用 Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理一、宏替换宏替换是用 #define指定的预处理1.不带参数的宏定义1 不带参数的宏定义命令行形式#define 宏名 替换文本 或#define 宏名Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编
3、译预处理如 : #define size 100以上标识符 size是宏名,是用户定义的标识符,不得与程序中的其它名字相同。在编译时,在此命令之后,预处理程序对源程序中的所有名为 size的标识符用 100三个字符来替换,这个替换过程称为 “宏替换 ”。这是一种简单的字符替换,不进行任何计算。所以不要认为“size等于整数 100”。 Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理例:#define PI 3.1415926#define R 3.0double circle() return 2.0*PI*R; double area() return
4、PI*R*R; Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理经过预处理后将形成以下源文件:double circle() return 2.0*3.1415926*3.0; double area() return 3.1415926*3.0*3.0; Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理使用宏替换的好处是 :提高程序可读性易修改性好,若用宏替换将半径 R修改为 5,则只需修改 1处,否则需修改 3处#define命令行可以不包含 “替换文本 ”,这种情况下仅说明标识符 “被定义 ”。Date甘肃联合大学甘
5、肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理2 替换文本中可以包含已定义过的宏名例如: #define PI 3.14#define ADDPI (PI+1)#define TWO-ADDPI (2*ADDPI)程序中若有表达式: x=TWO-ADDPI/2,则表达式将成为x=(2*(3.14+1)/2。若第二、三行的替换文本不加括号,直接写成 PI+1和 2*ADDPI,则以上表达式被替换为 x=2*3.14+1/2,所以,使用宏替换时一般要求把替换文本用()括起来 Date甘肃联合大学甘肃联合大学 电信学院电信学院 曹晓丽曹晓丽 第一节 编译预处理3 若宏定义在一行中写不下时,在行尾加 “”表示要续行,若 “”前或下一行的开头有空格,则在宏替换时也加入空格如:#define LEAP-YEAR year%4& year&100!=0|year%400=0第一列4 同一宏名不能重复定义,除非两个宏定义命令行完全一致 ,但这没有意义 Date