#define定义宏-->(宏常量和宏函数)

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定义的符号时,字符串常量的内容并不会被搜索
例子如下:

#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;
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50886514/article/details/112985757
今日推荐