①宏函数:STL模板、实现函数的复用性
函数:可以传递参数、但是不能将类型作为参数传递
例如:
一个开辟内存的函数:
#define Malloc(type,size) (type*)malloc( sizeof(type) * size )
int *p = Malloc(int,100);
char *q = Malloc(char,100);
②传递数组
函数参数传递只能传首地址,无大小,失去数组特性,所以排序等操作需要在函数里面进行遍历
宏函数可以传递首地址和大小,例如插入排序 sort(int *a,int size),这是在宏函数里面进行排序遍历
虽然这两者实现方法不同,但是好像并没有什么区别,都需要遍历,时空消耗差不多
③字符串化“#”
#define Print(str){
printf(#str”的值是%d”,str);
}
main(){
Print(3+4);
}
④片段连接符“##”:分割连接方式,先分割,再强制连接
#define Add(n,value)\
{\
//num1 += value;\
num##n += value;\
}
main(){
int num1=1,num2=10;
Add(2,10);
printf(“num1=%d\n num2=%d”,num1,num2);
}
个人感觉这个片段连接符很鸡肋,但是如果要通用,效果还是不错的。
在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些##来替代空格。
宏用法:
宏常量: #define STR “圆周率等于”
#define PI 3.14
printf(“%s %f”,STR,PI); //main中
宏语句:#define Print printf(“Hello world!”);
Print; //main中
宏函数:#define Print(str) printf(“%s”,str);
int main(){ printf(“这是一个只有一条语句的宏函数”); }
撤销宏定义:#define PI 3.1415926
#undef PI
宏相关作用符:末尾需要加上\
例如:有参宏函数
#define Show(str1,str2,str3)\
{\
printf(“%s\n”,str1);\
printf(“%s\n”,str2);\
printf(“%s\n”,str3);\
}
main中引用:show(“first”,”second”,”third”);
注意事项:
①由于宏都是在预处理阶段进行原样替换,所以要注意运算符优先级问题
②宏参数重复调用
#define MAX(a,b) ((a)>(b)?(a):(b)) int a=0; int b =1; int c =MAX(++a,++b); //等价于 int c =((++a)>(++b)?(++a):(++b));
③分号吞噬问题
if(num>0)
FUN(num);
else
…
//等价于
if(num>0){FUN(num)};
else …//导致else缺少if的错误, ‘else’ without a previous ‘if’
#include"stdio.h" #define FUN(n)\ {\ while(n>0)\ {\ if(n==3)\ break;\ }\ } int main() { int num=10; if(num>0) FUN(num); else num=-num; return 0; }
④递归调用问题,编译器默认调用1次
#define num num+4
⑤宏参数预处理
#define A(y) X_##y #define B(y) A(y) #define SIZE 1024 #define S SIZE
宏优点:代码复用率高;提高性能
宏缺点:不可调试;无安全类型检查;可读性差,容易出错
转至博客 鸣鼓ming 大大C语言_宏定义_鸣鼓ming的博客-CSDN博客_c 宏定义详情请点击链接
今天的文章宏函数详解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/76063.html