文章目录
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_info
、demo_warn
和demo_err
,每个函数都可以接受格式化字符串和可变数量的参数(就像printf
函数一样)。变长参数由va_list
处理,使用va_start
和va_end
宏来操作。
然后我们定义了三个宏DEMO_DGB_INFO
、DEMO_DGB_WARN
和DEMO_DGB_ERROR
来表示不同的日志级别,以及一个宏DEMO_DGB_LEVEL`来代表当前的日志级别。
根据DEMO_DGB_LEVEL
的值,我们定义了三个日志宏DEMO_DGB_INFO
、DEMO_DGB_WARN
和 DEMO_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
的日志将不会打印。