C语言:使用#define宏定义的几个小技巧

1、调试开关

  有时候编写程序时为方便查找错误,会在很多地方加上串口打印语句直观查看程序哪里出错。但是,串口的输出是需要时间的,在项目基本完成时,就需要将这些打印关闭,但是一行一行的注释掉费时费力,不现实。这时可以使用宏来当做一个"开关",直接操作这个宏就可以实现打印的开关,例如:

//#define	DEBUG(...)
#define		DEBUG	printf

另外,还可以使用几个预定义的宏进行辅助:

__FILE__			// 文件
__FUNCTION__		// 函数
__LINE__			// 行号

DEBUG("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

2、条件编译

当程序为了适配更多不同的环境时,还可以使用条件宏来选择不同的代码模块:

#if 1
	printf("Hello!\n");
#else
	printf("Hi!\n");
#endif

3、宏实现函数

交换两个数:

#define swap(a,b) 	((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b))

比较两个数并且返回最小的数:

#define MIN(a,b) 	((a)<(b)?(a):(b))

求数组元素个数:

#define LENGTH(array)	(sizeof(array) / sizeof(array[0]))

4、跨行宏定义

#define	SWAP(a,b)	do { \
		    			int t = 0;\
						t = a; \
						a = b; \
						b = t; \
					} while(0)

细心的你可能已经注意到以上宏末尾都没有带分号“;”

5、防止头文件被重复包含

#ifndef __TEST_H 
#define __TEST_H 
	// 头文件内容 
#endif

6、带参宏与带参函数的区别

  1. 宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已;
  2. 宏进行定义时不会考虑参数的类型;
  3. 参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小;
  4. 参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作;
  5. 参数宏在定义时要多加小心,多加括号;
  6. 函数只在目标文件中存在一处,比较节省程序空间;
  7. 函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢;
  8. 函数的参数存在传值和传地址(指针)的问题,参数宏不存在;

7、注意事项

  • 1、宏定义不会对引号内的参数进行替换;

  • 2、若要替换,可以在参数前面加上’#’转换成“字符串”,如:

#define dprint(expr) printf(#expr " = %d\n", expr)

使用dprint(x/y)就被替换成:

printf("x/y" " = %g\n", x/y);

printf("x/y = %g\n", x/y);

8、可变参数的宏定义

https://blog.csdn.net/weixin_44498318/article/details/115277893

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-QWERT

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值