开门见山的说:
目录
#difine定义标识符
#difine可以定义标识符
可以是整形
可以是字符串
可以是表达式
可以是代码语句
#include<stdio.h>
#define Int 100//整形
#define Char "结果等于"//字符串
#define Expression(x,y) ((x)*(y))//表达式
#define Sentence printf//代码语句
int main()
{
int c = Int;
Sentence(Char "%d\n", Expression(c, c));
//两段代码本质上是一样的
printf("结果等于%d\n", 100 * 100);
return 0;
}
宏的定义
#define Expression(x,y) ((x)*(y))//表达式
这个Expression(c, c);代码就是100*100,有点类似于函数传参,但和函数完全不一样
注意在 #define定义宏表达式时候,不要吝啬括号的使用,因为宏本质是上是补充了代码,需要明确
运算符之间的优先顺序
补充:#undef这条指令用于移除一个宏定义。#undef NAME// 如果需要重新定义,那么它的旧名字首先要被移除。
宏和函数的区别
我将从四个方面进行分析
代码效率
操作方面
功能性
参数问题
代码效率
宏:宏本质是代码的替换,本身延长的代码的长度,但对比函数不需要额外开辟空间和栈空间,效率更快,空间利用率更高。
函数:需要额外开辟空间,会存在调用和返回的时间和空间上的损耗。
操作方面
宏:没有参数的限制,只要是符合宏定义的都可以使用。
需要用括号保证优先级,以防运算出错操作性不高,复杂代码难以实现
函数:虽然只能使用函数定义的参数,但代码灵活性高,可以实现复杂代码,求值更容易预测。
功能性
宏:不方便调试,不方便排查问题,不能实现递归和高阶函数功能,
函数:可以调试,方便排查错误,可以递归实现高阶函数功能,更利于解决复杂问题。
参数问题
宏:宏的参数不会销毁,会存在多次调用重复参赛,导致代码出错
函数:函数的参数会销毁,不会多次调用重复参数导致出错
符号#
在宏定义时,使用 # , 把一个宏参数变成对应的字符串下面把参数i变成字符串10.
#include<stdio.h>
#define P(i) printf(#i)
int main()
{
P(10); printf("等于%d\n", 10);
return 0;
}
结果图
符号##
在宏定义时,##可以把位于它两边的符号合成一个符号。
下面把cl 和 ss合并为clss
#include<stdio.h>
#define C cl##ss
int main()
{
int clss = 105;
printf("班级是%d\n",C );
return 0;
}
结果图
哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞吧
Thanks♪(・ω・)ノ
(期待一下,要是有分享和收藏更好啦)