初识回显控制

  昨天在群里有朋友提到回显控制,以前从没听说过,所以一时兴起,今天就乘着SVN下载代码期间学习一下,话不多说直接贴代码:

#include <stdio.h>
#include <stdarg.h>

//回显类型
typedef enum
{
	NONE_ECHO = 0,
	ERROR_ECHO = (1 << 0),
	WARNING_ECHO = (1 << 1),
	DEBUGGING_ECHO = (1 << 2),
}echo_type_e;

//回显授权控制
typedef enum
{
	DISABLE_ALL = 0,
	ENABLE_ERROR = (1 << 0),
	ENABLE_WARNING = (1 << 1),
	ENABLE_DEBUGGING = (1 << 2),
	DISABLE_ERROR = ~(1 << 0),
	DISABLE_WARNING = ~(1 << 1),
	DISABLE_DEBUGGING = ~(1 << 2),
}EnableEcho_e;

typedef struct 
{
	int ID;
	char name[100];
	EnableEcho_e Debug;
}MyStruct_t;

//回显打印函数
void echoCtrl(EnableEcho_e myType, EnableEcho_e type, const char* file, const int line, const char *msg, ...)
{
	char temp[1024];
	va_list args;
	va_start(args, msg);
	vsprintf(temp, msg, args);
	va_end(args);
	switch (type)
	{
		case NONE_ECHO:
		break;
		case ERROR_ECHO:
			if (ERROR_ECHO & myType)
			{
				printf("\033[0;41m [ERROR] [%s, %d]", file, line);
				printf(temp, (void *)0);
				printf("\033[0m\n");
			}
		break;
		case WARNING_ECHO:
			if (WARNING_ECHO & myType)
			{
				printf("\033[0;42m [WARNNING] [%s, %d]", file, line);
				printf(temp, (void *)0);
				printf("\033[0m\n");
			}
		break;
		case DEBUGGING_ECHO:
			if (DEBUGGING_ECHO & myType)
			{
				printf("\033[0;44m [DEBUG] [%s, %d]", file, line);
				printf(temp, (void *)0);
				printf("\033[0m\n");
			}
		break;
		default:
		break;
	}
}
//可变参数函数的两个宏定义写法
#define OUTPUT_ERROR(type, msg, ...) 		echoCtrl(type, ERROR_ECHO, __FILE__, __LINE__, msg, __VA_ARGS__)	//第一种
#define OUTPUT_WARNNING(type, msg...) 	echoCtrl(type, WARNING_ECHO, __FILE__, __LINE__, ##msg)					//第二种
#define OUTPUT_DEBUG(type, msg, ...) 		echoCtrl(type, DEBUGGING_ECHO, __FILE__, __LINE__, msg, __VA_ARGS__)


int main()
{
	//打开错误和警告回显
	MyStruct_t my_obj = {10010, "chen", ENABLE_ERROR | ENABLE_WARNING};
	OUTPUT_ERROR(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	OUTPUT_WARNNING(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	OUTPUT_DEBUG(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	//打开错误和调试回显,关闭警告回显
	my_obj.Debug &= DISABLE_WARNING;
	my_obj.Debug |= ENABLE_DEBUGGING;
	printf("------------------------------------\n");
	OUTPUT_ERROR(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	OUTPUT_WARNNING(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	OUTPUT_DEBUG(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	
	//关闭所有回显
	my_obj.Debug &= DISABLE_ALL;
	printf("------------------------------------\n");
	OUTPUT_ERROR(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	OUTPUT_WARNNING(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	OUTPUT_DEBUG(my_obj.Debug, "my_id:%d, my_name:%s", my_obj.ID, my_obj.name);
	return 0;
}

  

转载于:https://www.cnblogs.com/ThatsMyTiger/p/7284002.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值