学科分类
目录
C语言

不带参数的宏定义

在程序中,经常会定义一些常量,如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所示。

img

图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的值,只在更改宏定义的地方即可。

image-20200521134153697脚下留心:宏定义注意事项

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
点击此处
隐藏目录