文档详情

C语言教材第7章编译预处理学习资料.ppt

发布:2025-05-10约4.26千字共13页下载文档
文本预览下载声明

第七章编译预处理预处理命令:以“#”号开头的命令,在对程序进行编译之前执行。例如:#includestdio.h#definePI3.14159预处理命令不是C语言本身的组成部分,不能被编译程序所识别,必须在编译之前先由专门的预处理程序进行转换。预处理命令一律以“#”号打头,以“回车”而不是分号结束。一、宏定义#define有两类:(1)不带参数的宏;(2)带参数的宏1.不带参数的宏#define标识符[字符序列]“标识符”为宏名。命名规则与变量名相同。“字符序列”为宏内容。预处理时,用宏内容替代宏名。#definepi3.14159#defineMSGPressanykeytocontinue…\nvoidmain(){doubler=2.0,s;printf(%f\n,pi);s=pi*r*r;pi=3.14;//错误,PI不是变量3.14159=3.14;printf(MSG);}不带参数的宏经常用于:常量定义。注意:(1)宏定义只能以“回车”结束,预处理程序将宏定义中从宏名之后的第一个非空格字符开始到回车符之间的所有字符作为替换文本。例如:#defineSTEP10;将语句i+=STEP/2;替换成i+=10;/2;//编译发现错误将语句i+=STEP-2;替换成i+=10;-2;//编译没发现该错误(2)如果宏定义超过一行,可以在该行行末加一个反斜杠“\”来续行。#defineLONG_STRINGthisis\notaverylongstring(3)如果在字符常量、字符串和注释中出现宏名,则不作扩展。例如:#defineHIHello不对语句printf(“HI”);进行扩展。(4)允许嵌套使用宏:一个宏名可以出现在另一个宏的替换文本中。例如:#defineX5#defineYX+1#defineZY*X对语句a=Z;进行扩展,过程如下:a=Y*X;=a=X+1*5;=a=5+1*5;表达式要尽量加括号,例如:#defineY(X+1)a=Y*X;=a=(X+1)*5;=a=(5+1)*5;(5)尽管宏名也是一个标识符,但它不是变量,不分配内存空间,因此不能当做变量使用。为了便于与变量名及其他标识符相区分,习惯上将宏名写成大写。例如:#definePI3(6)宏定义中可以没有替换文本。例如:#defineEMPTY无参宏定义的好处:(1)提高程序的可读性,描述性的宏名有助于更好地理解对应的替换文本中的含义和用途。例如:#defineNUM100for(i=0;iNUM;i++)sum+=a[i];(2)减少程序中同一个常量的重复书写,并方便对该常量的修改。例如:#definePI3……s=PI*r*r;l=2*PI*r;更直观,而且修改精度时只要修改一次。一、宏定义2.带参数的宏(类似于函数)#define标识符(参数表)字符序列#includestdio.h#defineMULT1(a,b)(a)*(b)#defineMULT2(a,b)a*bvoidmain(){ intx=5; printf(%d\

显示全部
相似文档