第10章 预处理命令_第1页
第10章 预处理命令_第2页
第10章 预处理命令_第3页
第10章 预处理命令_第4页
第10章 预处理命令_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言编程实战宝典大家好!!!第10章

预处理命令预处理器的行为是由指令所控制的。这些指令是由#字符开头的,可以说,预处理指令以符号#作为行的开关。预处理指令可以出现在源文件中的任何位置,指令的作用域从其定义的位置开始直到本文件结尾。10.1预处理器的工作方式#define指令定义了一个宏,宏是一个名字,它通常指代某一类型的常量。预处理器会将宏的名字和它的定义存储在一起,当这个宏在其后的程序中用到的时候,预处理器就“扩展”该宏,即将宏名用宏定义中的值替换掉。#include指令告诉编译器去打开一个特定的文件,并将这个文件的内容作为正在编译的文件的一部分包含进来。/*求b值*/#include<stdio.h>

#defineLEN20#defineSCALE(3.0/5.0)

main(){ floata,b; printf("Entervaluea:"); scanf("%f",&a);

b=(a+LEN)*SCALE; printf("Thevalueofbis:%f\n",b);}空行空行从文件stdio.h中引入的行空行空行空行空行main(){ floata,b; printf("Entervaluea:"); scanf("%f",&a);

b=(a+20)*(3.0/5.0); printf("Thevalueofbis:%f\n",b);}10.2预处理指令预处理的指令主要类型有3种,具体如下:1.宏定义。#define和#undef指令。2.文件包含。#include指令3.条件编译。#if、#ifdef、#ifndef、#elif、#else和#endif指令。10.2预处理指令1.所有的预处理指令都以#开头。2.预处理指令的各个符号之间可以插入任意数量的空格或横向制表符。3.预处理指令总是在第一个换行符出现时结束,除非明确指明下一行仍然属于该指令。4.预处理指令可以在程序的任何位置出现。5.预处理指令的注释可以与该指令位于同一行。10.3宏定义宏可以带参数,也可以不带参数,C语言编译器对带参数的宏提供了支持。10.3.1不带参数的宏不带参数的宏定义格式为:#define标识符替换列表当预处理器在程序中发现了宏的实例后,总会用替换列表来代替该宏(即替换宏名)。从宏变成最终的替换文本的过程称为宏展开。对不带参数的宏的几点说明:(1)宏名通常使用大写字母来表示,以便与变量名相区分。(2)当程序中需要多次重复书写某个字符串时可以考虑使用宏。(3)预处理器进行宏展开时只做替换,而不会进行正确性检查,如果宏定义中的替换文本写错了,那么宏展开时也会照样进行替换。(4)宏定义不是C语言的语句,在行末结尾处不需要加分号,否则会连同分号一起进行替换。(5)宏名的有效作用范围为从该#define命令之后到本源文件结束。(6)如果想在程序中的某个位置终止宏定义的作用域则可以使用#undef命令。10.3.2带参数的宏带参数的宏不是只进行简单的字符串替换,还需要进行参数替换。带参数的宏定义格式为:#define标识符(x1,x2,...,xn)替换列表10.3.2带参数的宏当预处理器碰到一个带参数的宏时,它首先会将其定义存储起来。在后面的程序中,如果出现了“

宏名(y1,y2,...yn)”格式的宏调用(其中y1,y2,...yn则是一系列参数值),则预处理器就会使用已存储起来的宏的替换列表进行替换,并使用参数值y1来替换x1,参数值y2来替换x2,...,参数值yn来替换xn。10.3.2带参数的宏假设定义了如下的宏:#defineAREA(x)x*x如果在后续的程序中出现了如下的语句:z=AREA(5);那么预编译器会将其替换为:z=5*5;10.3.3#运算符宏定义中还可以包含两个特殊的运算符:#和##。它们对应的运算会在预处理时被执行。#符号作为一个预处理运算符,可以将宏的参数转换为字符串的字面量。它只能出现在带参数宏的替换列表中。10.3.3#运算符#include<stdio.h>#defineAREA(x)printf("Theareaof"#x"is%d\n",((x)*(x)));main(){

inty=3;

AREA(y);

AREA(2+5);}该程序输出如下:Theareaofyis9Theareaof2+5is4910.3.4##运算符##运算符也可以用于宏定义中的替换部分,它可以将两个符号组合成为一个符号。例如,可以定义下面的宏:#defineNAME(n)a##n如果宏调用为NAME(3),那么这个宏可以展开为:a310.3.5取消宏定义可以使用#undef命令来终止宏定义的作用域。假设有如下定义:#defineNUM50则指令:#undefNUM会取消该定义。此后就可以重新定义NUM宏,给它一个新值。10.3.6宏和函数很多实际问题既可以使用带参数的宏来解决,也可以使用函数来完成。那么到底应该选择哪一种呢?这没有硬性的规定,但是有些规则可以作为参考。在使用宏时,如果不谨慎的话就可能会出现一些无法预料的结果,因此宏在某些情况下比一般的函数要更复杂。对于某个具体问题是选择宏还是函数实际上是对时间和空间的权衡。频繁的函数调用比使用宏要更费时。宏所具有的一个优点就是它不会对参数的类型进行检查,因此一个宏可以用于多种类型。如int类型和float类型的参数都可以使用宏AREA(x)。10.3.7宏定义(#define)和

类型定义(typedef)宏定义用来替代变量或函数,是由源程序中宏定义命令完成的。类型定义使用typedef关键字,它可以定义一种类型的新别名,它不同于宏,不是简单的字符串替换。10.4条件编译在编写程序时,有时候希望只对其中的一部分内容在满足某个条件的情况下才进行编译,这就是条件编译。10.4.1#if…#endif指令#if...#endif指令的格式为:#if表达式

程序段#endif它的作用是当指定的表达式值为真(非零)时就对程序段进行编译,否则不编译该程序段。10.4.1#if…#endif指令首先定义一个宏CONDITION,并给它一个非0的值:#defineCONDITION1接下来,使用#if...#endif指令:#ifCONDITION printf("correct");#endif10.4.2#if…#else…#endif指令#if...#else...#endif指令的格式为:#if表达式

程序段1#else

程序段2#endif它的作用是当指定的表达式值为真(非零)时就对程序段1进行编译,否则编译程序段2。10.4.3#if…#elif…#endif指令#if...#elif..#endif指令的格式为:#if表达式1

程序段1#elif表达式2

程序段2 ...#elif表达式n

程序段n#endif10.4.3#if…#elif…#endif指令#ifCONDITION==1 printf("up");#elifCONDITION==2 printf("down");#elifCONDITON==3 printf("loop");#endif10.4.4#ifdef…#endif指令#ifdef指令用于测试一个标识符是否已经定义为宏,它的使用方法与#if指令类似。其格式为:#ifdef标识符

程序段#endif10.4.4#ifdef…#endif指令还可以在#ifdef和#endif之间添加#else语句,格式为:#ifdef标识符

程序段1#else

程序段2#endif10.4.5#ifndef…#endif指令#ifndef指令与#ifdef指令的作用相反,它测试的是标识符是否没有被定义为宏。其格式为:#ifndef标识符

程序段#endif10.4.5#ifndef…#endif指令还可以在#ifndef和#endif之间添加#else语句,格式为:#ifndef标识符

程序段1#else

程序段2#endif此时表示若标识符未被定义为宏,则编译程序段1,否则编译程序段2。10.5文件包含所谓文件包含指的是一个源文件可以将另外一个源文件的全部文件都包含进来,即将另外一个文件包含到本文件中。C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论