// custom_printf.h #ifndef CUSTOM_PRINTF_H #define CUSTOM_PRINTF_H #include #include #include // ✅ 确保 QtMsgType 被正确包含 #ifdef __cplusplus #include #include // 假设这些是你管理输出的列表 extern std::list errorList; extern std::list warnList; extern std::list normalList; extern std::list debugList; // 开关 extern bool errorOutputEnabled; extern bool warnOutputEnabled; extern bool normalOutputEnabled; extern bool debugOutputEnabled; void redirectErrorOutput(bool enabled); void redirectWarnOutput(bool enabled); void redirectNormalOutput(bool enabled); // ------------------ 重定向函数 ------------------ void redirectDebugOutput(bool enable); // ------------------ Qt 的消息处理函数 (Qt4) ------------------ // Qt4 使用 qInstallMsgHandler(...),签名: void myMsgHandler(QtMsgType, const char*) void myQtMsgHandler(QtMsgType type, const char* msg); extern pthread_mutex_t errorListMutex; extern pthread_mutex_t warnListMutex; extern pthread_mutex_t normalListMutex; extern pthread_mutex_t debugListMutex; // **声明原始 echo_msgX(),让编译器知道它们存在** void real_echo_msg(const char *format, ...); // **拦截所有 `echo_msgX()`,让它同时存入 `normalList`** #define echo_msgX(format, ...) \ do { \ char buffer[1024]; \ snprintf(buffer, sizeof(buffer), format, ##__VA_ARGS__); \ \ /* ✅ 先打印到 Shell,确保不会卡死 */ \ printf("%s", buffer); \ fflush(stdout); /* ✅ 立即刷新,防止标准输出缓存 */ \ \ /* ✅ 先创建日志副本,避免锁住 `normalList` 过久 */ \ std::string logEntry(buffer); \ \ /* ✅ 仅在 `normalList` 操作时加锁,避免死锁 */ \ pthread_mutex_lock(&normalListMutex); \ normalList.push_back(logEntry); \ pthread_mutex_unlock(&normalListMutex); \ } while (0) // **宏自动展开不同的 `echo_msg` 变体** #define echo_msg1 echo_msgX #define echo_msg2 echo_msgX #define echo_msg3 echo_msgX #define echo_msg4 echo_msgX #define echo_msg5 echo_msgX #define echo_msg6 echo_msgX #define echo_msg7 echo_msgX #define echo_msg8 echo_msgX #define echo_msg9 echo_msgX #define echo_msg10 echo_msgX #define echo_msg11 echo_msgX // **如果有更多的 `echo_msgX()`,继续定义** extern "C" { #endif // 自定义的 printf 函数 int customPrintf(const char* format, ...); #ifdef __cplusplus } #endif // 使用宏将 printf 替换为 customPrintf #define printf customPrintf #endif // CUSTOM_PRINTF_H