c语言预处理命令课件,C语言初学习预处理命令.ppt

第9章预处理命令 教师于扬 主要内容 一 宏定义二 文件包含三 条件编译 预处理命令 所谓预处理 就是C编译程序对C源程序编译前由编译预处理程序对预处理命令进行处理的过程 C语言中 以 开头 如 define 的语句统称为编译预处理命令 这些命令必须在一行的开头以 开始 末尾不加分号 以区别一般的C语句 C语言的预处理命令 按功能不同分三类 宏定义 define undef文件包含 include条件编译 if else 9 1宏定义 宏替换 一 不带参数的宏定义即符号常量定义语句 就是用一个指定的标识符来代表一个字符串 其一般形式为 define宏名 标识符 替换文本编译时编译预处理程序自动对源程序中的 宏名 用 替换文本 来替换 也叫作宏展开 例如 defineLENGTH300 definePI3 1415926 宏替换使用说明 1 宏名一般用大写字母 以示与一般变量区别 2 使用宏替换的作用是提高程序的清晰性 可移植性 3 在同一个程序段中 同一个宏名不能重复定义 4 替换文本 中可以包含已定义过的宏名 5 替换文本 不能替换双引号中的字符串 defineR3 0 definePI3 1415926 defineL2 PI R definesPI R Rmain printf L f nS f n L S 6 宏定义是用宏名代替一个字符串 是简单的置换 并不作语法检查 例 definePI3 l4l59其中将3 l4l59中的1误写成l 在编译此名时并不指出宏定义有错误 而是在编译到含有PI的语句时指出PI有错 7 宏定义语句末尾不能加分号 否则会连分号一起置换 8 可用 undef命令终止宏定义的作用域 9 宏定义是专门用于预处理命令的一个专用名词 它与定义变量的含义不同 只作字符替换 不分配内存空间 9 1 2带参数的宏定义 一般形式 define宏名 参数表 字符串说明 字符串 中包含 参数表 中所指定的参数 例 带参数的宏定义 defineDB x x 2 main doubley floatz 10 y DB z 等价于 y z 2 printf y f n y 区别函数和带参数的宏定义 函数调用时 先求出实参表达式的值 再用这个值赋给形式参数 带参数的宏定义仅仅进行字符串的简单替换 函数调用是在程序运行时分配临时内存单元 而宏展开是在编译时进行 展开时不分配内存单元 不进行值传递 函数调用只占运行时间 宏替换只占编译时间 宏替换后使源程序增长 函数调用不会 写出下面程序的运行结果 defineMIN x y x y x y main inti 10 j 15 k k 10 MIN i j printf d n k 100 应展开为 10 x y x y 15 9 2文件包含 文件包含就是在一个文件中 包含另外一个文件的全部内容 文件包含功能由 include命令来实现 include命令的一般形式 include 文件名称 include在一些版本的C语言中 还允许 文件名 中带路径 include file2 c A A B B file1 c file1 c file2 c 包含 文件包含示意图 a b 说明 被包含的文件常以 h head 结尾 用在文件头部 被称为 标题文件 或 头部文件 其扩展名也可以为其它 如 c 如果需要修改一些常数 不必修改每个程序 只需修改一个文件 头部文件 即可 例9 8 include的使用 include includemain floata b floatc scanf f f 区别 文件名 和 关于 include的使用 include 文件名 带双引号的文件名 系统将先在源程序所在的目录内查找指定的包含文件 如果找不到 再按照系统指定的标准方式到相关的目录中去寻找 多用于包含用户文件 include文件名用尖括号括起来 则系统将直接按照指定的标准方式到相关的目录中去寻找 多用于包含标准库函数 FileEditRunCompileProjectOptionsDebugBreak watch Compiler Linker Environment Directories Includedirectories C TC INCLUDE Librarydirectories C TC LIB Outputdirectory D CDATA TurboCdirectory C TC Pickfilename Currentpickfile 使用文件包含需注意 一条文件包含命令只能包含一个文件 如果需要包含多个文件 就必须使用多条文件包含命令 文件包含的定义是可以嵌套的 即允许一个被包含的文件包含其它文件 被包含文件与其所在的文件在预编译后成为同一个文件 9 3条件编译 条件编译是指编译时对源程序的某种控制 在一定的条件下 源程序中的某些特殊语句参加编译 而在另一种条件下 同样的这些语句不参加编译 常用命令 ifdef命令 ifndef命令 if命令 条件编译格式一 ifdef命令 格式 ifdef标识符程序段1 else程序段2 endif功能 当 标识符 已经被定义过 则编译程序段1 否则编译程序段2 条件编译格式二 ifndef命令 格式 ifndef标识符程序段1 else程序段2 endif功能 当 标识符 未被定义过 则编译程序段1 否则编译程序段2 条件编译格式三 if命令 格式 if表达式程序段1 else程序段2 endif功能 当 表达式 的值非0时 则编译程序段1 否则编译程序段2 例1 defineDEBUGmain inta 14 b 15 c c a b ifdefDEBUGprintf a d b d n a b elseprintf c d n c endif 例2 main inta 14 b 15 c c a b ifndefDEBUGprintf a d b d n a b elseprintf c d n c endif 例3 defineDEBUG1main inta 14 b 15 c c a b ifDEBUGprintf a d b d n a b elseprintf c d n c endif 9 4预定义宏 预定义宏是C编译器预先定义好的宏 不是用户定义的 因而不能出现在 define与 undef语句中 如 FILE DATE 等一些常见预定义宏标识符 例 预定义宏使用举例 main printf s n FILE printf s n DATE printf s n TIME 结果显示 c data a cMay22200121 02 54 9 5运算符 和 在带参数的宏替换中 若形参中含有 例如 definedisplay i printf i display Thisisatest 则替换为 printf Thisisatest 字符串 字符串 宏替换符号 例如 构造标识符 definevar n i n i var x 4 x4 字符串1 字符串2 字符串1字符串2 课堂练习 1 以下叙述中不正确的是 A 预处理命令行都必须以 号开始 B C程序中凡是以 开始的命令行都是预处理命令行 C C程序在执行过程中对预处理命令进行预处理 D 以下是正确的宏定义 defineIBM PC 2 在宏定义 definePI3 1415926中 用宏名PI代替一个 A 常量 B 单精度数 C 双精度数 D 字符串 3 以下程序的运行结果是 include stdio h defineFUDGE y 2 84 y definePR a printf d int a definePRINT1 a PR a putchar n main intx 2 PRINT1 FUDGE 5 x 4 以下程序的运行结果是 main intb 5 defineb2 definef x b x inty 3 printf 4d f y 1 undefbprintf 4d f y 1 defineb3printf 4d n f y 1 5 设有以下程序 为使之正确运行 请填入应包含的命令行 其中 tryme 函数在a myfile1 c中有定义 main printf n tryme 读程序 写结果 definePR ar printf d ar main intj a 1 3 5 7 9 11 13 15 i 5 for j 3 j j switch j case1 case2 PR a i break case3 PR a i 若有宏定义如下 definex5 defineYX 1 defineZY X 2那么执行以下printf语句后 输出结果是 inta a Y printf d n Z printf d n a A7B12C12D76655 若有宏定义 defineMOD x y x y则执行以下语句后的输出为 intz a 15 b 100 z MOD b a printf d n z A11B10C6D宏定义不合法

展开阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值