不带参数的宏定义
在程序中,经常会定义一些常量,如3.14、“ABC”,如果这些常量在程序中被频繁使用,难免会出现书写错误的情况。针对频繁使用常量的需求,为了避免程序书写错误,可以使用不带参数的宏定义表示这些常量,其语法格式如下所示:
#define 标识符 字符串
在上述语法格式中,#define用于定义一个宏,标识符指的是所定义的宏名,字符串指的是宏体,它可以是常量、表达式等。一般情况下,宏定义需要放在源程序的开头,函数定义的外面,它的有效范围是从宏定义语句开始至源文件结束。
下面看一个具体的宏定义,示例代码如下:
#define PI 3.1415926
上述宏定义的作用就是使用标识符PI来代表数据3.1415926。如此一来,凡是在后面程序中出现PI的地方都会被替换为3.1415926。
接下来通过一个案例演示宏定义的使用,如例11所示。
例1 definePI.c
1 #include <stdio.h>
2 #define PI 3.1415926 //宏定义
3 int main()
4 {
5 printf("%f\n", PI); //使用宏定义
6 return 0;
7 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2行代码定义了一个宏PI,其值为3.1415926;第5行代码在main()函数中调用printf()函数输出了PI的值。由图1可知,程序成功的输出了PI的值。
在例1中,第2行代码定义了宏PI之后,在后面程序中,只要出现PI的地方,程序在预处理时都会将PI替换为3.1415926。预处理之后,第5行代码如下所示:
printf("%f\n", 3.1415926);
如果程序中有很多地方用到PI,预处理器会将所有的PI都替换为3.1415926。如果需要更换PI的值,只在更改宏定义的地方即可。
脚下留心:宏定义注意事项
1、宏定义的末尾不用加分号,如果加了分号,将被视为被替换的字符串的一部分。由于宏定义只是简单的字符串替换,并不进行语法检查,因此,宏替换的错误要等到系统编译时才能被发现。
例如,有如下宏定义:
#define MAX 20;
//......
if(result==MAX)
printf("equal");
经过宏定义替换后,其中的if语句将变为:
if(result==20;)
显然上述语句存在语法错误。
2、如果宏定义中的字符串出现运算符,需要在合适的位置加上括号,如果不添加括号可能会出现错误,例如,有如下宏定义:
#define S 3+4
//......
a=S*c;
对于表达式a=Sc,宏定义替换后的代码如下所示:*
a=3+4*c;
这样的运行结果显然不符合需求。因此,在定义宏S时,应加上小括号,代码如下所示:
#define S (3+4)
//......
a=S*c; //预处理之后:a=(3+4)*c;
3、宏定义允许嵌套,宏定义中的字符串中可以使用已经定义的宏名。示例代码如下:
#define PI 3.141592 //定义宏PI
#define P PI*5 //使用已经定义的宏PI定义另一个宏
printf("%f", P);
嵌套定义的宏,在预处理时也会依次替换,宏替换后的代码如下所示:
printf("%f", 3.141592*5);
4、宏定义不支持递归,下面的宏定义是错误的。
#define MAX MAX+5