如何修改C程序将DEBUG_HISTORY变量历史写入日志文件而非控制台
修改代码将变量历史保存到日志文件而非控制台
我来帮你调整代码,把原来输出到控制台的变量历史转到日志文件里,同时解决原代码里潜在的宏递归问题,还不用额外加printf语句。
首先,核心思路是把printf换成fprintf定向到文件,同时确保日志文件只打开一次,程序结束时自动关闭。下面是修改后的完整代码:
#include "stdio.h" #include <stdlib.h> // 用于atexit和exit函数 int a = 1; int b = 1; #if DEBUG_HISTORY // 定义日志文件名,方便后续修改 #define HISTORY_LOG_FILE "var_history.log" // 全局文件指针,控制日志文件的打开/关闭 FILE *history_log = NULL; // 程序退出时自动关闭日志文件的清理函数 void close_history_log() { if (history_log != NULL) { fclose(history_log); history_log = NULL; } } // 保存原始变量的指针,避免宏递归问题 int *pa = &a; int *pb = &b; // 重定义a的宏:先写日志,再返回原始变量的值 #define a do { \ // 第一次访问时打开日志文件 if (history_log == NULL) { \ // 用"w"模式会覆盖旧日志,改成"a"可以追加日志 history_log = fopen(HISTORY_LOG_FILE, "w"); \ if (history_log == NULL) { \ perror("Failed to open history log file"); \ exit(EXIT_FAILURE); \ } \ // 注册清理函数,确保程序结束时关闭文件 atexit(close_history_log); \ } \ // 写入变量当前值到日志,用*pa避免触发宏递归 fprintf(history_log, "a = %d\n", *pa); \ } while(0); (*pa) // 重定义b的宏逻辑和a一致 #define b do { \ if (history_log == NULL) { \ history_log = fopen(HISTORY_LOG_FILE, "w"); \ if (history_log == NULL) { \ perror("Failed to open history log file"); \ exit(EXIT_FAILURE); \ } \ atexit(close_history_log); \ } \ fprintf(history_log, "b = %d\n", *pb); \ } while(0); (*pb) #endif int main() { int i; for (i=1; i<4; i++) { a += i; b *= i; } return 0; }
关键修改说明:
- 避免宏递归:原代码里
printf("a = %d", a)会触发宏的无限递归展开,这里改用*pa直接访问原始变量的内存地址,彻底解决这个问题 - 日志文件管理:用全局文件指针控制,第一次访问变量时打开文件,并用
atexit注册关闭函数,保证程序正常结束时自动释放文件资源 - 可配置性:把日志文件名定义成宏
HISTORY_LOG_FILE,想改文件名直接改这里就行;如果需要每次运行追加日志,把fopen的"w"改成"a"即可
使用方式:
还是用原来的编译命令:
gcc -DDEBUG_HISTORY your_file.c -o program
运行程序后,当前目录下会生成var_history.log文件,内容和你之前控制台输出的完全一致:
a = 1 b = 1 a = 2 b = 1 a = 4 b = 2
内容的提问来源于stack exchange,提问作者Fakhfekh Ziad
相关产品推荐
相关产品推荐

