宏函数详解

本文详细介绍了C语言中的宏定义,包括宏常量、宏语句和宏函数的使用,以及预处理器的特殊操作如字符串化“#”和片段连接符“##”。同时,指出了宏定义可能带来的问题,如运算符优先级、分号吞噬、递归调用和参数预处理等,并给出了实例分析。此外,还讨论了宏定义的优缺点,如代码复用性和性能提升,但同时也存在不可调试、无类型检查和易出错的缺点。
摘要由CSDN通过智能技术生成

①宏函数: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 宏定义详情请点击链接

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值