1.#define 宏
宏可分为以下两类
宏常量语法实例:#define N 10
宏函数语法实例:#define ADD(x,y) ((x)+(y))
注意:• 宏后面没有分号(;)
• 宏函数不是真正的函数,是一种替换机制,所以操作符的优先级会影响宏的求值,
应尽量使用括号明确优先级
• 宏不能递归
2.宏的优缺点
缺点
:a.不能调试
b.写法有很多注意点,很容易出错,不容易控制
c.宏可能带来运算符优先级的问题
优点
:a.宏常量可以提高代码的可维护性
b.宏函数可以提高效率,宏函数是直接替换的,不需要像普通函数那样要建立栈帧,建立栈帧是有消耗的(一般比较简单的实现才会使用宏,如果函数实现太复杂,宏函数很难控制)
3.宏常量
#include<stdio.h>
#define N 10
int main()
{
int a = N;
printf("%d\n", a);
return 0;
}
4.宏函数
#include<stdio.h>
#define ADD(x,y) ((x)+(y))
int main()
{
printf("%d\n", ADD(1,2));
return 0;
}
5.宏函数的错误书写
(1)代码
#include<stdio.h>
#define ADD(x,y) (x + y)
int main()
{
int a = 3;
int b = 2;
printf("%d\n", ADD(a | b,a & b));
return 0;
}
(2)分析
宏函数不是真正的函数,是一种替换机制,如上代码相当于用a|b替换下,用a&b替换y,有引文+的优先级高于&和|,所以出现如下运行结果
(3)错误运行结果
(4)正确格式如下:
#include<stdio.h>
#define ADD(x,y) ((x) + (y))
int main()
{
int a = 3;
int b = 2;
printf("%d\n", ADD(a | b,a & b));
return 0;
}
(5)正确运行结果
6.#在宏中的用法
当预处理器搜索#define定义的符号时,字符串常量的内容并不会被搜索
例子如下:
扫描二维码关注公众号,回复:
12411519 查看本文章
#include<stdio.h>
#define PRINTF(format,value) printf("the value is "format"\n",value);
//宏不会替换字符串里的value
int main()
{
PRINTF("%d", 10);//宏替换printf("the value is ""%d""\n",10);
return 0;
}
如果想让字符串里的value也被替换用#value
#include<stdio.h>
#define PRINTF(format,value) printf("the "#value" is "format"\n",value);
int main()
{
PRINTF("%d", 10 + 3);//宏替换printf("the "10 + 3" is "%d"\n",13);
return 0;
}