Đề xuất của Jonathan là tốt nhưng vì C99 chúng tôi có macro Vdd nên không cần sử dụng dấu ngoặc kép cho macro gỡ lỗi.
Có một phiên bản nhẹ của tiêu đề khai thác gỗ tôi sử dụng:
#define LOG_FATAL (1)
#define LOG_ERR (2)
#define LOG_WARN (3)
#define LOG_INFO (4)
#define LOG_DBG (5)
#define LOG(level, ...) do { \
if (level <= debug_level) { \
fprintf(dbgstream,"%s:%d:", __FILE__, __LINE__); \
fprintf(dbgstream, __VA_ARGS__); \
fprintf(dbgstream, "\n"); \
fflush(dbgstream); \
} \
} while (0)
extern FILE *dbgstream;
extern int debug_level;
Vì vậy, bất cứ nơi nào tôi cần phải đăng nhập gì đó, tôi chỉ cần thêm dòng như
LOG(LOG_ERR, "I/O error %s occured while opening file %s", strerror(errno), filename);
Trong chương trình khởi động bạn cần chỉ định các giá trị cho dbgstream
(thường mặc định là stderr
) và debug_level
.
Đối với dự án thực thay vì gọi fprintf
nhiêu lần tôi chỉ cần gọi chức năng của tôi từ LOG
vĩ mô và vượt qua __FILE__
, __LINE__
và __VA_ARGS_
như là đối số - mà chức năng cũng in ngày, giờ và pid trong dòng nhật ký, và không làm fflush()
mọi lúc - chỉ khi bộ đếm đệm vượt quá giá trị đặt trước - tăng hiệu suất ghi nhật ký một cách đáng kể.
Nhưng xin lưu ý rằng một số trình biên dịch có thể không hỗ trợ các macro variadic vì nó chỉ được giới thiệu trong C99.
Xem thêm [C '# define' macro để gỡ lỗi in] (https://stackoverflow.com/questions/1644868) để biết thêm ý tưởng về chủ đề này. Các cuộc thảo luận có nhiều hơn về xử lý bất kỳ so với không gỡ lỗi/đăng nhập, nhưng điều đó tạo thành một lõi cho các ý tưởng gỡ lỗi/đăng nhập đa cấp được thảo luận ở đây. –