不带参数的宏定义一般形式是:#define宏名字符串例如:#definePI3.1415926其中,宏名用标识符表示,也就是前面讨论过的符号常量,上面示例中的PI就是宏名。正确使用“宏定义”的关键是宏调用时的“原样替换”。宏定义使用的简单示例。④宏定义不存在类型问题,它的参数也是无类型的。⑦宏定义允许嵌套。如:#defineN100#defineM2*N#defineK5+M⑧可以用#undef或不带替换字符串的宏定义终止宏定义的作用域。......
2023-11-20
不带参数的宏用指定标识符来代替一个字符串。其一般格式为:
#define标识符 字符串
例如:
#define PI 3.1415926
用标识符PI来表示3.1415926,这叫做宏定义。这时的字符串是一个字符序列,除非是表示一个字符串常量,一般不用双引号括起。另外,宏不是语句,它不以分号结束,而以换行符结束。当宏比较长(在一行写不下)时,可在行尾加上符号\表示下一行是这一行的继续,例如:
#define MESSAGE"if the length of this message\
is very long"
一个宏的作用域是从定义处一直到本文件的结束。但多数人习惯把所有的宏定义都写在文件的前面虽然这不是必须的。
一个宏定义后,就可以在程序中使用了,例如:
这个函数返回圆的面积。如果不用宏可以写成
上面两个程序结果是完全一样的。
在实际情况中,预处理程序对宏的处理是:遇到宏名(标识符)就用其代表的字符串替换,即所谓的宏替换。因此,上面第一个程序在正式编译之前,系统就将其先预处理为上面第二个程序的形式。预处理是编译时由系统自动完成的,用户不必关心。从用户角度看,使用宏可以使程序具有更好的可读性。
程序中使用的常量一般都有一定的物理意义,人们很难从数字本身中看出这种意义。比如,C语言中没有专门的逻辑变量,为了进行逻辑运算,规定表达式非0时为真(true),给出的逻辑值为1;表达式为0时为假(false),给出的逻辑值为0。这里的1、0与一般意义下的1、0形式上没有任何不同,不容易让人理解,有了宏,我们就可以很方便地解决这个问题了。例如:
#define TRUE 1
#define FALSE 0
定义之后,当需要给出逻辑值真时就使用TRUE,当需要给出逻辑值假时就用FALSE。
在定义宏时,还可以用到以前定义的宏,如(www.chuimin.cn)
#define PI 3.1415926
#define R 2.0
#define AREA PI*R*R
这里定义AREA时用到了另外两个宏PI和R。
最后指出在程序设计中,使用宏定义预处理命令时应特别注意的地方:
(1)宏定义以换行结束,不要用分号结束,如果PI定义为
#define PI 3.1415926;
则
return(PI*r*r);
经替换后变成
return(3.1415926; *r*r);
一看就知道是错误的。
(2)如果双引号内出现与宏名相同的字符串,则这个字符串不被替代。例如
运行结果:
what is your name
HELLO
有关C语言程序设计 第2版的文章
不带参数的宏定义一般形式是:#define宏名字符串例如:#definePI3.1415926其中,宏名用标识符表示,也就是前面讨论过的符号常量,上面示例中的PI就是宏名。正确使用“宏定义”的关键是宏调用时的“原样替换”。宏定义使用的简单示例。④宏定义不存在类型问题,它的参数也是无类型的。⑦宏定义允许嵌套。如:#defineN100#defineM2*N#defineK5+M⑧可以用#undef或不带替换字符串的宏定义终止宏定义的作用域。......
2023-11-20
宏也可以带参数,其定义的一般形式为:#define标识符 字符串其中标识符是宏名,字符串中包含括号内指定的参数,称为宏扩展。这时由于带参数的宏从形式上看很像函数,为了统一,多数人在定义带参数的宏时喜欢使用小写字母。......
2023-11-18
使用带参数宏定义时,除了前面提到的使用宏定义预处理的注意事项外,还要注意下面几点:①带参宏定义中,宏名和形参表之间不能有空格出现。②带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而带参数的宏对实参表达式不作计算直接照原样代换,只是进行简单的替换。③带参数宏的形式参数与函数中的形式参数不同,它没有确定的数据类型。带参数宏调用替换问题的理解示例。......
2023-11-20
在进行C语言程序设计时,合理使用库函数有以下好处:①对于某些功能的实现已经存在标准化的函数代码,这时直接使用库函数,可以避免重复编制,简化程序设计过程,提高程序设计的效率。②库函数在开发时充分考虑了各种影响因素,经过了长期使用的考验,使用标准库函数可以使程序的健壮性得到足够的保证,从而提高编程的质量。使用标准库函数时要注意函数的功能、参数的个数与类型、函数值的类型。......
2023-11-20
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
C语言把括号、赋值、强制类型转换等都作为运算符处理,灵活使用各种运算符可以实现在其他高级语言中难以实现的运算,功能强大。另外,C语言还把括号、下标、强制类型转换、取地址等都作为运算符处理,并通过与算数运算符的组合达到不同的目的,从而使程序更加简洁明了。C语言具有超强的可移植性。总之,C语言在运算符方面是比较容易让人混淆的。......
2023-11-18
习惯把用typedef声明的类型名用大写字母表示,以便与系统提供的标准类型标识符区别。用tpyedef可以声明数组类型、字符串类型,使用比较方便。用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。使用typedef有利于程序的通用与移植。有时程序会依赖于硬件特性,用typedef便于移植,例如,有的计算机系统int型数据占用2个字节,而另一些机器则占用4个字节。......
2023-11-18
C语言的最大特点是:功能强、使用方便灵活。由于这个“灵活”给程序的调试带来了许多不便,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的错误。在C语言中大写字母和小写字母是两个不同的字符。C语言规定以’\0’作字符串结束标志,它是由系统自动加上的。当一个语句中使用多层括弧时常出现这类错误。main()C语言中对数组的定义或引用数组元素时必须用方括弧。......
2023-11-18
相关推荐