宏是C语言中一个重要的概念,学好了宏的相关知识可以很大的方便C语言编程,可以改进程序的设计环境,提高程序运行效率。宏作用在程序的预处理阶段,不对它们进行编译(编译器不识别)。
有两种宏:
1、不带参数的宏定义
(1)形式:#define 标识符 字符串
(2)说明:
a、宏名一般习惯用大写字母,以便与变量名区别
b、使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量
c、宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查
d、 宏定义不是C语句,不必在行末加分号
e、#define命令出现在程序中函数的外面,宏名的有效范围为定义命令子后到本源文件结束。通常,#define命令在文件的开头,函数之前,作为文件的一部分,在次文件范围内有效。
f、可以用#undef命令终止宏定义的作用域
g、在进行宏定义时,可以引用以定义的宏名,可以层层置换
h、对程序中用双撇号括起来的字符串内的字符,即使宏名相同,也不进行置换
i、宏定义时专门用于预处理命令的一个专用名词,它与定义的变量的含义不同,只作字符替换,不分配内存空间。
#include <stdio.h>
#define PRICE 20
int main()
{
int num = 10;
int total;
total = num * PRICE;
printf("the total is %d!\n",total);
return 0;
}
带参数的宏定义:
不是简单的进行字符串替换,还要进行参数替换
(1)形式:#define 标识符(参数) 字符串
(2)说明:
a、对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参
b、在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空壳以后的字符都将作为替代字符串的一部分
#include <stdio.h>
#define MAX(a,b) a>b?a:b
int main()
{
int m = 10;
int n = 20;
int max = MAX(m,n);
printf("%d\n",max);
return 0;
}
在使用带参数的宏时一定要注意参数的使用范围和一些运算的优先级。看下面的一个例子。
#include <stdio.h>
#define MAX(a,b) a>b?a:b
int main()
{
int m = 10;
int n = 20;
int max = 3 * MAX(m,n);
printf("%d\n",max);
return 0;
}
第一眼看去输出的是3和MAX(m,n)的乘积,应该是60,可是真实输出却是10。仔细分析不难发现宏发生在预编译阶段,其实在编译时int max = 3 * m>n?m:n; 所以与n相比的不是m,而是3*m。
只需加上括号就能避免类似问题!
#include <stdio.h>
#define MAX(a,b) a>b?a:b
int main()
{
int m = 10;
int n = 20;
int max = 3 * (MAX(m,n));
printf("%d\n",max);
return 0;
}
为了避免或减少上述情况的出现,对于像上面例子中求两个数中的最大值问题可以用函数解决,避免一些不容易发现的问题。
还有一个就是宏发生在预编译阶段,不能被调试,若大量的使用宏的话以后都代码的调试将会非常困难。所以就是对宏的使用要谨慎。