资源描述:
《C语言-条件编译》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第九章条件编译回顾指针是一个变量,它存储另一个对象的内存地址指针的声明由基本类型、星号(*)和变量名组成为指针赋值,赋值运算符右侧必须是一个地址。如果是普通变量需要在前面加一个取地址运算符&;如果是另一个指针变量或者是一个数组,不需要加&运算符运算符*用于返回指针指向的内存地址中存储的值指针的算术运算的含义是指针的移动,将指针执行加上或者减去一个整数值n的运算相当于指针向前或向后移动n个数据单元指针可以执行比较相等的运算,用来判断两个指针是否指向同一个变量指向数组的指针,存储的是数组中元素的地址。目标理解以“#”号开头编译预处理。理解宏定义。理解条件编译。预处
2、理命令是由ANSIC统一规定的,但是它不是C语言本身的组成部分,不能直接对它们进行编译。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。现在使用的许多C编译系统都包括了预处理、编译和连接等部分,在进行编译时一气呵成。因此不少用户误认为预处理命令是C语言的一部分,甚至以为它们是C语句,这是不对的。C提供的预处理功能主要有以下三种:1.宏定义2.文件包含3.条件编译为了与一般C语句相区别,这
3、些命令以符号“#”开头。9.1宏定义9.1宏定义9.1.1不带参数的宏定义用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:#define标识符字符串例:#definePI3.1415926把这个标识符(名字)称为“宏名”;在预编译时将宏名替换成字符串的过程称为“宏展开”;#define是宏定义命令。例9.1利用不带参数的宏计算(1)圆的面积;(2)矩形面积;(3)三角形面积。#include#definePI3.14#definea1.2#defineb2.4#defines2a*b#definex1.2#definey2.4#
4、defines3x*y/2.0voidmain(){doubler,s1;printf(“请输入圆的半径r:”);scanf(“%lf”,&r);s1=PI*r*r;printf(“圆的面积s1=%lf”,s1);printf(“矩形的面积s2=%lf”,s2);printf(“三角形的面积s3=%lf”,s3);}9.1宏定义【注意点】(1)在预定义中已经用到的符号不能在函数中再定义,如:doubles2,s3,a,b,x,y;(2)在不带参数的宏定义中像a,b,x,y必须先预定义后才能在后面的宏定义中使用,即宏定义可以嵌套,宏定义的字符串中可以
5、使用已定义的宏名,在宏展开时由预处理程序层层代换;例如:#definea1.2#defineb2.4#defines2a*b(3)在宏定义中,符号常量一般大写,本例中有大写也有小写。(4)编译器在编译之前把程序中出现的一切宏用其对应的表达式字符串来替代,而不是计算表达式的值后才替代,即宏定义是用宏名表示的一个字符串,在宏展开时又以该字符串取代宏,这只是一种简单的代换,字符串可以含有任何字符,可以是常量,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时才发现。9.1宏定义(5)在#define语句中,宏与字符串之间用空格隔开
6、,在表达式末尾没有分号,不然分号也会被认为是表达式的一部分而出现在程序中宏出现的位置。(6)如果在双引号中的字符串中出现宏名,则此字符串中的和宏名相同的字符是普通字符不会被替换。例如:printf(“矩形的面积s2=%lf”,s2);该语句中的第1个s2就不会被替换。另外对“输出格式”作宏定义,可以减少书写麻烦,但可读性差。例如:#include#definePprintf#defineD“%d”#defineF“%f”voidmain(){inta=1,c=2;floatb=1.2,d=2.4;P(DF,a,b);P(DF,c,
7、d);}9.2带参数的宏定义C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为:#define宏名(形参表)字符串在字符串中含有各个形参。带参数的宏调用的一般形式为:宏名(实参表);例如:#defineS2(a,b)(a)*(b)/*宏定义*/……printf(“矩形的面积S2=%lf”,S2(1.2,2.4));/*宏调用*/……在宏调用时,用实参1.2和2.4去代替形参a,b,经预处理宏展开后的语句为:printf(“矩形的面积S2=%l
8、f”,1.2*2.4);例9.2利