【ARM 嵌入式 C 入门及渐进 8 -- C 打印等级实现及介绍】

C 打印等级实现及介绍

在C语言中,可以使用预处理器指令来定义宏,并根据宏的值选择调用不同的打印函数。以下是一个示例,展示了如何定义DEMO_DGB_LEVEL`宏并根据它的值调用不同的函数:

 #include <stdio.h> 

// 假定以下是打印函数的声明 
void demo_info(const char *msg) { printf("INFO: %s\n", msg); } 
void demo_warn(const char *msg) { printf("WARN: %s\n", msg); } 
void demo_err(const char *msg) { printf("ERROR: %s\n", msg); }


// 定义不同级别的宏 
#define DEMO_DGB_INFO 1 
#define DEMO_DGB_WARN 2 
#define DEMO_DGB_ERROR 3

// 定义DEMO_DGB_LEVEL宏来控制打印级别 
#define DEMO_DGB_LEVEL DEMO_DGB_WARN

// 根据DEMO_DGB_LEVEL的值定义DEMO_PRINT宏
#if DEMO_DGB_LEVEL >= DEMO_DGB_ERROR 
	#define DEMO_PRINT(level, fmt, ...) do { \ 
		if (level >= DEMO_DGB_LEVEL) demo_err(fmt, ##__VA_ARGS__); \ 
	} while(0)
#elif DEMO_DGB_LEVEL >= DEMO_DGB_WARN 
	#define DEMO_PRINT(level, msg) do { \ 
		if (level >= DEMO_DGB_LEVEL) demo_warn(fmt, ##__VA_ARGS__); \ 
	} while(0)
#elif DEMO_DGB_LEVEL >= DEMO_DGB_INFO 
	#define DEMO_PRINT(level, msg) do { \ 
		if (level >= DEMO_DGB_LEVEL) demo_info(fmt, ##__VA_ARGS__); \ 
	} while(0)
#else 
	#define DEMO_PRINT(level, fmt, ...) // 不打印任何信息 
#endif

int main(void) 
{ 
	// 使用DEMO_PRINT宏打印不同级别的信息 
	DEMO_PRINT(DEMO_DGB_INFO, "This is an info message."); 
	DEMO_PRINT(DEMO_DGB_WARN, "This is a warning message."); 
	DEMO_PRINT(DEMO_DGB_ERROR, "This is an error message."); 

	return 0; 
}

在这个例子中,我们定义了三个不同的打印函数demo_infodemo_warndemo_err,每个函数都可以接受格式化字符串和可变数量的参数(就像printf函数一样)。变长参数由va_list处理,使用va_startva_end宏来操作。

然后我们定义了三个宏DEMO_DGB_INFODEMO_DGB_WARNDEMO_DGB_ERROR来表示不同的日志级别,以及一个宏DEMO_DGB_LEVEL`来代表当前的日志级别。

根据DEMO_DGB_LEVEL 的值,我们定义了三个日志宏DEMO_DGB_INFODEMO_DGB_WARNDEMO_DGB_ERR,它们通过条件编译要么调用对应的打印函数,要么展开为空操作(No operation)。这里使用了##__VA_ARGS__宏来处理传递给日志宏的参数。

main函数中,我们使用这些宏来打印不同级别的信息。你可以通过更改DEMO_DBG_LEVEL的值来控制日志的输出。在这个例子中,所有级别的日志都会被打印,因为DEMO_DBG_LEVEL被设置为DEMO_DBG_INFO,这是最低的日志级别。如果你将DEMO_DBG_LEVEL设置为更高的级别,例如DEMO_DBG_WARN,那么DEMO_DBG_INFO的日志将不会打印。

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 23:20:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 23:20:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 23:20:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 23:20:05       18 阅读

热门阅读

  1. 全屏时框架的message alert 下拉框失效问题

    2024-03-19 23:20:05       17 阅读
  2. Linux 常用运维使用指令

    2024-03-19 23:20:05       20 阅读
  3. pytorch升级打怪(五)

    2024-03-19 23:20:05       18 阅读
  4. C++学习之旅(一)- 序言

    2024-03-19 23:20:05       18 阅读
  5. android 网络检测简单方法

    2024-03-19 23:20:05       19 阅读
  6. 【C语言】数组基础

    2024-03-19 23:20:05       19 阅读
  7. Linux作业

    2024-03-19 23:20:05       17 阅读
  8. 网页的制作

    2024-03-19 23:20:05       17 阅读
  9. 关于我的经历

    2024-03-19 23:20:05       21 阅读
  10. 【笔记】Linux常用命令

    2024-03-19 23:20:05       17 阅读