C语言程序ch8编译预处理

上传人:cl****1 文档编号:590891955 上传时间:2024-09-16 格式:PPT 页数:21 大小:187.50KB
返回 下载 相关 举报
C语言程序ch8编译预处理_第1页
第1页 / 共21页
C语言程序ch8编译预处理_第2页
第2页 / 共21页
C语言程序ch8编译预处理_第3页
第3页 / 共21页
C语言程序ch8编译预处理_第4页
第4页 / 共21页
C语言程序ch8编译预处理_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《C语言程序ch8编译预处理》由会员分享,可在线阅读,更多相关《C语言程序ch8编译预处理(21页珍藏版)》请在金锄头文库上搜索。

1、第八章本章主要内容本章主要内容3.了解条件了解条件编译编译命令命令 C的源程序的源程序 预处理理 编译 目目标程序程序 (*.C) _ (*.OBJ)编译系系统中有中有 : 预处理程序理程序 编译程序程序宏替换 #define N 20 文件包含 #include条件编译 if( . ) C中的中的预处理命令理命令分分类类宏定宏定义义有两种有两种类类型型:字符串替字符串替换换和和带带参数的宏替参数的宏替换换 1 字符串宏替字符串宏替换换 功能:功能:在在预处预处理理时时 ,将程序中宏定将程序中宏定义义之后出之后出现现的的所有的宏名所有的宏名,用宏替用宏替换换体代替。体代替。宏替宏替换名名宏替宏

2、替换体体 格式:格式:#define 标识符字符串符字符串 C的的编译程序程序调用用预处理程序理程序检查有否有否宏名宏名,若有,若有,用用宏替宏替换体体将其替将其替换,完成之后,将替,完成之后,将替换后的源程序后的源程序交交该编译程序。程序。8.1 8.1 宏定宏定义义 用途用途: 常用的符号常数常用的符号常数 数数组组的的长长度度 #define N 10 /* 编译编译之前用之前用10替替换换所有的所有的N */.int aN 说说明明:v 通常放在程序开通常放在程序开头头, ,不加分号不加分号v 是代替是代替, ,不是不是赋值赋值( (不作不作语语法法检查检查) )v 可将多个可将多个语

3、语句或表达式定句或表达式定义为义为一个宏替一个宏替换换v 区区别变别变量和关量和关键键字字, ,习惯习惯用大写用大写#define L 2.0*PI*R#define S PI*R*Rv 双引号中的不替双引号中的不替换换v 有效范有效范围围, ,从定从定义义开始到程序开始到程序结结尾尾main( ) printf (“PI=%fn”,PI); 结结果:果:main( ) printf(“PI=%sn”,”PI”); v 可以嵌套可以嵌套, ,后定后定义义的宏可以包含先定的宏可以包含先定义义的宏名的宏名结结果果:PI=PI2 带带参数的宏定参数的宏定义义 带带参数的宏不参数的宏不仅仅能能进进行字

4、符串代替,而且行字符串代替,而且还进还进行参数代行参数代换换。 格式:格式: #define 宏名(参数表)宏名(参数表) 表达式表达式 功能功能: 带参数的宏将一个参数的宏将一个带形参形参的表达式定的表达式定义为一个一个带参数参数的宏名,的宏名,预处理程序理程序对程序中所有程序中所有带实参参表的宏名表的宏名进行行宏宏展开展开替替换,用表达式代替宏名,用参数表中的用表达式代替宏名,用参数表中的实参代替表参代替表达式中达式中对应的形参的形参。例:例:#define S( a, b) a*b程序中程序中 S(3, 2) 3*2 用途:用途:用用带参数的宏可以代表一些参数的宏可以代表一些简短的表达式

5、,提高短的表达式,提高程序程序执行的效率。行的效率。* * 宏定宏定义可以嵌套可以嵌套* * 对对常用的格式常用的格式输输入入输输出函数出函数printfprintf可以可以进进行宏定行宏定义义,使程序,使程序简简化化* *宏名与参数的宏名与参数的圆圆括号之括号之间间不能有空格不能有空格 s (a,b) s (a,b) 说明:明:* 宏定宏定义义命令要求在一行内写完,如命令要求在一行内写完,如换换行,用行,用“”表表示下一行示下一行继续继续。* * 对对于宏定于宏定义义的形参要根据需要加上的形参要根据需要加上圆圆括号,以免括号,以免 发发生运算生运算错误错误例例1 使用有参宏替使用有参宏替换换

6、求园的面求园的面积积。 #define S(r) PI*r*r main() float a=3.6,area; area=S(a); printf(“r=%fnarea=%fn”,a,area); 例例2 求下列求下列语语句的循句的循环环次数。次数。 #include “stdio.h” #define N 2 #define M N+1 #define NUM (M+1)*M/2 main() int i,n=0; for(i=1;i=NUM;i+) n+; printf(“%d”,n); 8函数要求形参,函数要求形参,实实参有参有类类型(相同)型(相同) 宏的形参,宏的形参,实实参不要求

7、参不要求类类型,型,仅仅是符号是符号函数需事先函数需事先计计算算实实参表达式的参表达式的值值,再代入形参,再代入形参宏展开中不求表达式的宏展开中不求表达式的值值,仅仅替替换换, 没有没有值传递值传递函数是在运行函数是在运行时处时处理理宏是在宏是在编译编译之前之前进进行行带带参数的宏与函数的区参数的宏与函数的区别别函数函数调调用影响运行用影响运行时间时间,源程序无,源程序无变变化化宏展开影响宏展开影响编译时间编译时间,通常使源程序加,通常使源程序加长长函数函数调调用有一个返回用有一个返回值值 宏可以有多个宏可以有多个结结果果例例:求最大求最大值值。(答案中用答案中用U代表空格代表空格)#incl

8、ude #define MAX(x,y) _A_main() float a,b,c,d; scanf(%f%f, _B_ ); c=MAX(a,b); d=MAX(3+a,4*b); printf(c=%f,d=%f.n,c,d);A: xy?x:yB: &a,&b 文件包含是指一个程序文件将另一个指定文件的文件包含是指一个程序文件将另一个指定文件的全部内容包含全部内容包含进进来。来。 格式格式: #include 或或: #include “文件名文件名”8.2 8.2 文件包含文件包含 功能功能: 用指定文件的全部内容代用指定文件的全部内容代换该预处理行理行 ,C程序通程序通过#incl

9、ude预处理理,把一个指定的文件的把一个指定的文件的内容嵌入。内容嵌入。只能包含只能包含ASCII文本文件。文本文件。 与与“ ”“ ”的区的区别别: : 在在TCTC标标准目准目录录下找指定文件下找指定文件 “ ” “ ” 在用在用户户当前目当前目录录下找指定文件下找指定文件, ,如用如用户户当前目当前目录录下没有下没有, ,再到再到TCTC标标准目准目录录下找。下找。 说说明明 只包含源文件只包含源文件, ,不包含可不包含可执执行文件和目行文件和目标标文件。文件。 可以嵌套可以嵌套例如例如: :需包含需包含file2.c,file2.c,包含包含,在,在file1file1中中, ,用两次

10、用两次#include #include #include,#include,必必须须将将放在前面放在前面 一个一个#include#include只能包含一个文件只能包含一个文件用途用途 将符号常量将符号常量 , 带带参数的宏及构造参数的宏及构造类类型的型的变变量等量等定定义义在一个独立的文件中在一个独立的文件中,为为其他文件共享。其他文件共享。 程序程序员员可将工作中可将工作中积积累的有价累的有价值值的符号的符号,带带参数参数的宏定的宏定义义,或一些外部或一些外部变变量量,通用的子程序定通用的子程序定义义成一成一个文件个文件,需要需要时时,包含包含进进源程序。源程序。 使用使用C中的中的库

11、函数函数,需将所在的需将所在的头文件包含文件包含进源源程序。程序。“文件包含文件包含”示意示意图图 包含包含#include”file2.c” B A B A (a) (b) (c) 常用的有三种形式:常用的有三种形式: 形式一:形式一: #ifdef 宏名宏名 程序段程序段1; #else 程序段程序段2; #endif 或者:或者:#ifdef 宏名宏名 程序段;程序段;#endif 形式二:形式二: #ifndef 宏名宏名 程序段程序段1; #else 程序段程序段2; #endif其中,其中,# ifndef语语句的功能与句的功能与# ifdef相反,如果宏名相反,如果宏名未定未定义

12、则编译义则编译程序段程序段1,否,否则编译则编译程序程序2。 或者:或者:#ifndef 宏名宏名 程序段;程序段;#endif形式三:形式三: #if 常数表达式常数表达式 程序段程序段1; #else 程序段程序段2; #endif 功功能能:首首先先计计算算“常常数数表表达达式式”的的值值,如如果果为为真真(非非零零),就就编编译译“程程序序段段1”,否否则则编编译译“程程序序段段2”。如如果果没没有有#else部部分分,则则当当“常常数数表表达达式式”的的值值为为0时时,直接跳直接跳过过#endif。或者:或者:#if 常数表达式常数表达式 程序段;程序段;#endif例:例:阅读阅读程序。程序。#include main() #if NULL printf(NULL is non-zero value!n); #else printf(NULL is zero value!n); #endif运行运行结结果:果:NULL is zero value!条件条件编译编译可以嵌套使用,如:可以嵌套使用,如:#if表达式表达式1程序段程序段1;#else#if 表达式表达式2 程序段程序段2;#else 程序段程序段3;#endif#endif

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号