在C语言中,可以使用宏来自动填充文件名和行号。以下是一个自动填充文件名和行号的日志格式化的C语言代码实例:
#include <stdarg.h>
#include <stdio.h>
#include <time.h>
#define LOG_INFO(format, ...) log_info(__FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) log_error(__FILE__, __LINE__, format, ##__VA_ARGS__)
static inline void log_info(const char *file, int line, const char *format, ...)
{
time_t now = time(NULL);
struct tm *tm_now = localtime(&now);
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", tm_now);
printf("[%s] [INFO] [%s:%d] ", time_str, file, line);
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
static inline void log_error(const char *file, int line, const char *format, ...)
{
time_t now = time(NULL);
struct tm *tm_now = localtime(&now);
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", tm_now);
printf("[%s] [ERROR] [%s:%d] ", time_str, file, line);
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
#endif
在这个代码实例中,定义了两个宏LOG_INFO和LOG_ERROR,分别用于输出INFO和ERROR级别的日志。这些宏使用了可变参数宏的特性,可以自动填充文件名和行号。在调用LOG_INFO和LOG_ERROR时,只需要传递格式化字符串和参数列表即可。这种方式可以方便地实现日志的格式化和输出,并且可以自动填充文件名和行号,减少了代码的重复性。