无参宏就是用一个标识符代表一个字符串,程序中使用到无参宏的地方,预处理时会直接用该字符串替换无参宏。
对于宏的操作包括:宏定义、宏调用以及宏展开。
1.无参宏的定义形式
#define标识符字符串
例如:
#define PI 3.14159
说明:
①“#”表示这是一条预处理命令,“define”是宏定义命令,“标识符”是所定义的宏名,“字符串”可以是一个任意类型的常数、表达式、格式串等。
②宏名一般建议使用大写字母表示,以和普通变量区分开。
2.宏调用
在程序中当需要使用一个字符串时,用宏名表示。
例如,一个求圆面积和周长的程序如下:
#include <stdio.h>
#define PI 3.14159 /* 此处为宏定义 */
main()
{
int r=3;
float s,c;
printf("input radius:\n");
scanf ("%d",&r);
s=PI*r*r; /* 宏定义 */
c=2*PI*r; /* 宏定义 */
printf("s=%f ,c=%f\n",s,c);
}
程序中,无参宏PI-•旦定义,就可以在程序中用到 “3.14159” 的地方用PI来表示。
3.宏展开
编译预处理时用宏代表的字符串替换宏名的过程,称为宏展开,例如上述程序,宏展开后就成为:
main()
{
int r=3;
float s,c;
printf("input radius:\n");
scanf("%d",&r);
s=3.14159*r*r;
c=2*3.14159*r;
printf("s=%f,c=%f\n",s,c);
}
4.关于无参宏的使用说明
①宏定义不是C语言语句,不能在行尾加分号“;”,否则,宏展开时,会将分号作为字符串的一部分一起展开替换宏名。例如:
#define PI 3.14159;
展开时就会成为如下形式:
s=3.14159;*r*r;
②宏定义命令#define出现在函数的外部,宏名的有效范围是:从定义命令之后到本文件结束。通常,宏定义命令放在文件开头处。在程序中可以使用#undef命令终止宏定义的作用域,例如:
#include <stdio.h>
#define N 100
#define PI 3.14
main
{
…
}
#undef N
void fun()
{
…
}
由于#undef的作用,使宏f\ffimain()函数结束时就终止,所以fun()函数出现N也不代表100,但PI的作用域从开始定义一直到文件结束。使用#undef可以灵活地控制宏的作用范围。
③预处理器在用字符串替换程序中出现的宏时,只是简单地替换,并不做语法检查。例如,假设设计者手误,将3.14159写成了3.f4159:
#define PI 3.f4159
程序在编译时会出现“操作数无效”的错误。
5.无参宏的应用
无参宏在实际中可以应用到很多方面,主要有以下几个方面:
(1)符号常量
如前面用到的PI、N都是符号常量的形式。
恰当命名的符号常量能表达出宏所代表的字符串常量的实际含义,从而增强程序的可读性。例如:
#deflne EOF -1 /* 文件尾 */
#define NULL 0 /* 空指针 */
(2)用宏定义表示数据类型
用宏定义表示一个数据类型,在程序中使用宏来定义数据,非常方便且直观,例如:
#deflne SINGLE float
程序中,就可以使用SINGLE定义单精度变量,如:
SINGLE x, y:
(3)用宏定义表示输入和输出
例如:
#deflne PI 3.14
#define S PI*r*r
朴 define OUT printf("%f ",S)
#deflne IN scanf("%d",&r)
main ()
{
int r;
IN;
OUT;
}
IN代表输入函数scanf(),OUT代表输出函数printf()。
(4)用宏定义表示输出格式
上题所用的丨N和OUT不具备通用性,如果将程序稍作改变:
#define PI 3.14
#deflne S PI*r*r
#deflne F "%f"
#deflne D "%d"
#define OUT printf
#define IN scanf
main()
{
int r=3;
IN(D,&r);
OUT(F,S):
}
程序中用宏F代表格式字符"%f",用宏D代表格式字符"%d",这样凡是在程序中需要用到这两个格式字符的地方全部可以用F、D代替。
已有 22658 名学员学习以下课程通过考试
最需教育客户端 软件问题一手掌握
去 App Store 免费下载 iOS 客户端
点击加载更多评论>>