清华大学出版社 TSINGHUA UNIVERSITY PRESS 第九章 预处理命令
第九章
清华大学出版社 TSINGHUA UNIVERSITY PRESS 本章要点 预处理的概念 C语言处理系统的预处理功能 ●预处理命令的使用
⚫ 本章要点 •预处理的概念 •C语言处理系统的预处理功能 •预处理命令的使用
清华大学出版社 TSINGHUA UNIVERSITY PRESS ●主要内容 91宏定义 9.2“文件包含”处理 9.3条件编译
⚫ 主要内容 9.1 宏定义 9.2“文件包含”处理 9.3 条件编译
清华大学出版社 TSINGHUA UNIVERSITY PRESS 基本概念 ANSI C标准规定可以在C源程序中加入一些 预处理命令″,以改进程序设计环境,提 高编程效率。 这些预处理命令是由ANSⅠC统一规定的,但 是它不是C语言本身的组成部分,不能直接对 它们进行编译(因为编译程序不能识别它们) 必须在对程序进行通常的编译之前,先对程 序中这些特殊的命令进行“预处理” 经过预处理后程序可由编译程序对预处理后的 源程序进行通常的编译处理,得到可供执行的 目标代码。 4
4 基本概念 • ANSI C标准规定可以在C源程序中加入一些 “预处理命令” ,以改进程序设计环境,提 高编程效率。 • 这些预处理命令是由ANSI C统一规定的,但 是它不是C语言本身的组成部分,不能直接对 它们进行编译(因为编译程序不能识别它们) 。必须在对程序进行通常的编译之前,先对程 序中这些特殊的命令进行“预处理” 。 • 经过预处理后程序可由编译程序对预处理后的 源程序进行通常的编译处理,得到可供执行的 目标代码
清华大学出版社 TSINGHUA UNIVERSITY PRESS 基本概念 ·C语言与其他高级语言的一个重要区别是可以 使用预处理命令和具有预处理的功能。 C提供的预处理功能主要有以下三种 1.宏定义 2.文件包含 3.条件编译 这些功能分别用宏定义命令、文件包含命令 条件编译命令来实现。为了与一般C语句相 区别,这些命令以符号“#”开头。例如 #define #include 5
5 基本概念 • C语言与其他高级语言的一个重要区别是可以 使用预处理命令和具有预处理的功能。 C提供的预处理功能主要有以下三种: 1.宏定义 2.文件包含 3.条件编译 这些功能分别用宏定义命令、文件包含命令 、条件编译命令来实现。为了与一般C语句相 区别,这些命令以符号“#”开头。例如: #define #include
清华大学出版社 TSINGHUA UNIVERSITY PRESS 9.1宏定义 91.1不带参数的宏定义 宏定义一般# define标识符字符串 形式为:例如:# define pi31415926 宏定义的作用是在本程序文件中用指定的标识符PI 来代替“3.1415926这个字符串,在编译预处理时 ,将程序中在该命令以后出现的所有的P都用 3.1415926”代替。这种方法使用户能以一个简单 的名字代替个长的字符串。 这个标识符(名字)称为“宏名 在预编译时将宏名替换成字符串的过程称为“宏展 开”。# define是宏定义命令 6
6 9.1 宏定义 9.1.1 不带参数的宏定义 宏定义一般 形式为: #define 标识符 字符串 例如:# define PI 3.1415926 • 宏定义的作用是在本程序文件中用指定的标识符PI 来代替“3.1415926”这个字符串,在编译预处理时 ,将程序中在该命令以后出现的所有的PI都用 “3.1415926”代替。这种方法使用户能以一个简单 的名字代替一个长的字符串。 • 这个标识符(名字)称为“宏名” 。 • 在预编译时将宏名替换成字符串的过程称为“宏展 开” 。#define是宏定义命令
清华大学出版社 TSINGHUA UNIVERSITY PRESS 例9.1使用不带参数的宏定义。 #include #define pi 3. 1415926 void maino float l,s, rV printf("input radius: ) scanf("%f &r) l=2.0*PIr; s=PIror. v=4.0/3*Pir*r*r printf(l=%104f\ns=%104fnv=%104f\n",L,S, v) 7
7 #include #define PI 3.1415926 void main() {float l,s,r,v; printf("input radius:"); scanf("%f",&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r; printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v); } 例9.1 使用不带参数的宏定义
清华大学出版社 TSING 运行情况如下: 1=25.1328 s=50.2655 input radius:4K 说明: V=150.7966 (1)宏名一般习惯用大写字母表示,以便与变量名相 区别。但这并非规定,也可用小写字母。 (2)使用宏名代替一个字符串,可以减少程序中重复 书写某些字符串的工作量。 (3)宏定义是用宏名代替一个字符串,只作简单置换 ,不作正确性检查。只有在编译已被宏展开后的 源程序时才会发现语法错误并报错。 8
8 input radius: 4↙ 运行情况如下: 1=25.1328 s=50.2655 v=150.7966 (1) 宏名一般习惯用大写字母表示,以便与变量名相 区别。但这并非规定,也可用小写字母。 (2) 使用宏名代替一个字符串,可以减少程序中重复 书写某些字符串的工作量。 (3) 宏定义是用宏名代替一个字符串,只作简单置换 ,不作正确性检查。只有在编译已被宏展开后的 源程序时才会发现语法错误并报错。 说明:
清华大学出版社 TSINGHUA UNIVERSITY PRESS 说明: (4)宏定义不是C语句,不必在行未加分号。如果加 了分号则会连分号一起进行置换。 (5)# define命令出现在程序中函数的外面,宏名 的有效范围为定义命令之后到本源文件结束。通 常,# define命令写在文件开头,函数之前,作 为文件一部分,在此文件范围内有效。 (6)可以用# undef命令终止宏定义的作用域。 例如 9
9 (4) 宏定义不是C语句,不必在行末加分号。如果加 了分号则会连分号一起进行置换。 (5) #define命令出现在程序中函数的外面,宏名 的有效范围为定义命令之后到本源文件结束。通 常,#define命令写在文件开头,函数之前,作 为文件一部分,在此文件范围内有效。 (6) 可以用#undef命令终止宏定义的作用域。 例如: 说明:
清华大学出版社 TSINGHUA UNIVERSITY PRESS #define g 9.8 void maino G的有效范围 #undef g f10 在f1函数中,G不再代表 9.8。这样可以灵活控制宏 定义的作用范围。 10
10 #define G 9.8 _______ void main() ↑ { G的有效范围 … } -----↓---- #undef G f1() { … } 在f1函数中,G不再代表 9.8。这样可以灵活控制宏 定义的作用范围