宏定义可以分为2种:不带参数的宏定义 和带参数的宏定义。
1.不带参数的宏定义
形式:
#define宏名 字符串
比如#define ABC 10
右边的字符串也可以省略,比如#define ABC,它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。
接下来写个程序根据圆的半径计算周长
1 #include <stdio.h>
2
3 // 源程序中所有的宏名PI在编译预处理的时候都会被3.14所代替
4 #define PI 3.14
5
6 // 根据圆的半径计radius算周长
7 float girth(float radius)
{
8 return 2 * PI *radius;
9 }
10
11 int main ()
12 {
13 float g = girth(2);
14
15 printf("周长为:%f", g);
16 return 0;
17 }
使用注意:
1> 宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误
2> 对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。
3> 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查。4> 定义一个宏时可以引用已经定义的宏名
#define R 3.0
#define PI 3.14
#define L 2*PI*R
#define S PI*R*R
2.带参数的宏定义
形式:
#define 宏名(参数列表) 字符串
1 #include <stdio.h>
2
3 #define average(a, b) (a+b)/2
4
5 int main ()
6 {
7 int a = average(10, 4);
8
9 printf("平均值:%d", a);
10 return 0;
11 }
使用注意:
1> 宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串。
2>带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。