在一个嵌入式稍微大些的工程中实现模块化控制打印输出信息是很有必要的,下面是模仿别人的实现的模块化打印,需要时可以根据下面的实现代码去修改满足自己所需要的!!!
#include <stdio.h>
#include <string.h>
#include <stdint.h>
typedef enum {
DEBUG_LOG_ON,
DEBUG_LOG_OFF
} log_switch_t;
typedef enum {
PRINT_LEVEL_DEBUG,
PRINT_LEVEL_INFO,
PRINT_LEVEL_WARNING,
PRINT_LEVEL_ERROR
} print_level_t;
typedef void (*f_print_t)(void *handle, const char *func, int line, print_level_t level, const char *message, ...);
typedef struct {
const char *module_name;
log_switch_t log_switch;
print_level_t print_level;
f_print_t print_handle;
} log_control_block_t;
void print_module_log(void *handle, const char *func, int line, print_level_t level, const char *message, ...);
#define log_create_module(_module, _level) \
log_control_block_t log_control_block_##_module = \
{ \
#_module, \
(DEBUG_LOG_OFF), \
(_level), \
print_module_log \
}
#define LOG_I(_module, _message, ...) \
do { \
log_control_block_##_module.print_handle(&log_control_block_##_module, \
__func__, \
__LINE__, \
PRINT_LEVEL_INFO, \
(_message), \
##__VA_ARGS__); \
} while(0)
#define log_config_print_switch(_module, _log_switch) \
do { \
log_control_block_##_module.log_switch = (_log_switch); \
} while (0)
void print_module_log(void *handle, const char *func, int line, print_level_t level, const char *message, ...)
{
log_control_block_t* log_cotrol_block = (log_control_block_t*)handle;
if(log_cotrol_block->log_switch == DEBUG_LOG_ON)
{
char my_level[10] = {0};
switch(level)
{
case PRINT_LEVEL_DEBUG:
strcpy(my_level, "DEBUG");
break;
case PRINT_LEVEL_INFO:
strcpy(my_level, "INFO");
break;
case PRINT_LEVEL_WARNING:
strcpy(my_level, "WARNING");
break;
case PRINT_LEVEL_ERROR:
strcpy(my_level, "ERROR");
break;
default:
break;
}
__builtin_va_list __local_argv;
printf("[%s %d %s]", my_level, line, log_cotrol_block->module_name);
printf (message, __local_argv);
}
}
int main()
{
log_create_module(YANG, PRINT_LEVEL_INFO);
log_config_print_switch(YANG, DEBUG_LOG_ON);
log_create_module(HI, PRINT_LEVEL_INFO);
log_config_print_switch(HI, DEBUG_LOG_OFF);
LOG_I(YANG, "hello, YANG!!!\r\n");
LOG_I(HI, "hello, hi!!!\r\n");
return 0;
}
输出结果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)