/*
一、无参数宏定义
1、格式:#define 标识符 字符串
2、作用:用一个指定的标识符(即名字)来代表一个字符串;
3、说明:
(1)宏名一般用大写字母表示,与变量名相区别,;
(2)宏定义是用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量;
它只作简单置换,并不作正确性检查;(预编译时不作任何语法检查)
> #define PI 3.I4I5926 //将1写成I
> #define array_size 1000
int array[array_size];
(3)宏定义不是C语句,行末不可加分号";",若加分号,则会连分号一起进行置换;
(4)#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效;
(5)可以用#undef命令终止宏定义的作用域;
例如:#define G 9.8
void main( )
{
...
}
#undef G //G的作用范围到此结束,因此f函数中的G不代表9.8.
f()
{
...
}
(6)程序里双引号中字符串内的字符与宏名相同,也不会进行置换;
(7)宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,
并不分配内存空间;
*/
#include<stdio.h>
#define PI 3.1415926
int main(int argc, const char *argv[])
{
float L, s, r, v;
printf("input radius:");
scanf("%f",&r);
L = 2.0*PI*r;
s = PI*r*r;
v = 4.0 / 3 * PI*r*r*r;
printf("L=%10.4f\ns=%10.4f\nv=%10.4f\n",L,s,v);
}
/*
//进行宏定义时,可以引用已定义的宏名层层置换
#include<stdio.h>
#define R 3.0
#define PI 3.1415926
#define L 2.0*PI*R;
#define S PI*R*R;
#define V 4.0 / 3 * PI*R*R*R;
int main(int argc, const char *argv[])
{
printf("L=%10.4f\nS=%10.4f\nV=%10.4f\n",L,S,V);
}
*/
/*
二、含参数宏定义
1、格式:#define 宏名(参数列表) 字符串
2、说明:
(1)、带参数宏定义不是进行简单的字符串替换,还要进行参数替换。
(2)、对带参数的宏的展开只是将语句中宏名后面括号内的实参字符串代替#define命令行中的形参;
例如:#define S(a,b) a*b
area=S(3,2);
(3)、在宏定义时,宏名与带参数的括号之间不应加空格;否则将空格以后的字符都作为替代字符串的一部分;
例如:#define S (r)PI*r*r//此时S是符号常量(不带参数的宏名),它代表字符串"(r)PI*r*r"
area = S(a) //展开后 area =(r)PI*r*r(a)
(4)、在定义宏时,字符串中的形式参数应该加括号,否则将会违背设计者意愿;
例如:#define S(r) PI*r*r
area = S(a+b);//在对S(a+b)进行展开时,area=PI*a+b*a+b;
*/
#include<stdio.h>
#define PI 3.1415926
#define S(r) PI*(r)*(r)//S与(r)之间不能加空格
int main(int argc, const char *argv[])
{
float a, area;
a = 3.6;
area = S(a);
printf("r=%10.4f\narea=%10.4f\n",a,area);
}
|
|