使用printf让C语言也能像Android一样按级别输出Log

多年前项目中写的代码了,现在整理优快云博客,重新记录一下。

#include <stdio.h>

#define LOG_LEVEL 0x0F

#define LOG_LVL_ERROR 0x01
#define LOG_LVL_WARN  0x02
#define LOG_LVL_INFO  0x04
#define LOG_LVL_DEBUG 0x08

#if (LOG_LEVEL & LOG_LVL_ERROR)
#define LOGE(format, ...) \
    do { \
        fprintf(stderr, "ERROR   %-16s %4d   " format "\n", __FILE__, __LINE__, ##__VA_ARGS__ ); \
    } while (0)
#else
#define LOGE(format, ...) \
    do { } while (0)
#endif

#if (LOG_LEVEL & LOG_LVL_WARN)
#define LOGW(format, ...) \
    do { \
        fprintf(stderr, "WARNING %-16s %4d   " format "\n", __FILE__, __LINE__, ##__VA_ARGS__ ); \
    } while (0)
#else
#define LOGW(format, ...) \
    do { } while (0)
#endif

#if (LOG_LEVEL & LOG_LVL_INFO)
#define LOGI(format, ...) \
    do { \
        fprintf(stderr, "INFO    %-16s %4d   " format "\n", __FILE__, __LINE__, ##__VA_ARGS__ ); \
    } while (0)
#else
#define LOGI(format, ...) \
    do { } while (0)
#endif

#if (LOG_LEVEL & LOG_LVL_DEBUG)
#define LOGD(format, ...) \
    do { \
        fprintf(stderr, "DEBUG   %-16s %4d   " format "\n", __FILE__, __LINE__, ##__VA_ARGS__ ); \
    } while (0)
#else
#define LOGD(format, ...) \
    do { } while (0)
#endif
<think>好的,用户的问题是解决在C99标准下printf_log无效的问题,需要替代方案或解决方法。首先,我需要确认printf_log是什么,因为标准C库中没有这个函数。可能是用户自己定义的或者某个库中的函数。用户提到参考了引用[1],里面提到了C99的log10f函数,可能与日志记录有关。但用户的问题是关于printf_log无效,所以可能这个函数在C99环境下无法使用。 接下来,我需要考虑C99的标准库函数,常见的日志函数是printf,但用户可能想记录日志到文件或控制台,而printf_log可能不存在。可能的替代方案包括使用标准库中的fprintf配合文件操作,或者使用第三方日志库如log4c。另外,用户可能需要检查是否包含了正确的头文件,或者是否在C99模式下正确启用了相关特性。 还要注意用户提到的引用[2]是关于C语言聊天室项目的,可能涉及到网络编程中的日志记录,但可能与当前问题关联不大。需要确保用户代码符合C99标准,比如函数声明是否正确,变量是否在代码块开头声明等。 可能的解决方案包括: 1. 使用标准库的fprintf和vsprintf族函数实现自定义日志函数。 2. 使用第三方日志库。 3. 检查编译器设置,确保支持C99特性。 4. 检查函数命名是否正确,是否存在拼写错误。 5. 利用条件编译处理不同环境下的兼容性问题。 需要进一步询问用户是否使用了正确的函数名称,或者是否有代码示例,但根据现有信息,给出以上建议。同时提醒用户检查函数实现是否正确,比如可变参数的处理是否使用了<stdarg.h>。</think>### 分析问题 `printf_log` 并非C99标准库函数,可能是自定义或第三方库函数。根据引用[1]提到的C99数学函数命名规范,标准库函数通常有明确的命名约定(如`log10f`表示单精度浮点对数函数),而`printf_log`的命名不符合该模式,可能是以下原因导致无效: 1. 未正确引入相关头文件 2. 函数未在C99环境下实现 3. 编译器未启用C99模式 ### 解决方案 #### 方案一:使用标准库函数组合实现 通过`<stdio.h>`+`<stdarg.h>`实现格式化日志输出: ```c #include <stdio.h> #include <stdarg.h> void custom_log(const char* format, ...) { va_list args; va_start(args, format); vprintf(format, args); // 输出到控制台 va_end(args); // 若要写入文件可添加: // FILE* logfile = fopen("app.log", "a"); // vfprintf(logfile, format, args); // fclose(logfile); } ``` #### 方案二:使用第三方日志库 推荐使用符合C99标准的开源库: 1. **zlog**:高性能日志库,支持多线程和配置文件 2. **Pantheios**:类型安全的日志库接口 3. **log.c**:轻量级单文件实现(仅需`log.h`+`log.c`) #### 方案三:编译器设置调整 在编译命令中显式指定C99标准: ```bash gcc -std=c99 -pedantic your_program.c -o output ``` ### 关键验证步骤 1. 检查函数声明是否符合C99语法 ```c // 正确声明方式 void debug_log(const char* format, ...) __attribute__((format(printf, 1, 2))); ``` 2. 确认文件操作使用C99标准模式 ```c FILE* fp = fopen("debug.log", "a"); // 使用追加模式 if(fp) { fprintf(fp, "[INFO] %s:%d - ", __FILE__, __LINE__); // 更多日志内容 } ``` ### 性能优化建议 1. 采用缓冲写入机制减少I/O操作 2. 使用宏定义控制日志级别 ```c #define LOG_LEVEL 2 // 0:关闭 1:错误 2:警告 3:信息 #if LOG_LEVEL >= 3 #define LOG_INFO(...) custom_log(__VA_ARGS__) #else #define LOG_INFO(...) #endif ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值