如果我们想重定向输出到文件中,同时要求输出有多个参数。另外在debug模式下想要打印出一些log,但是release模式下不想打印出来,有一种通过宏屏蔽的方式,先上成功的方法。
#ifdef DEBUG
#define LOG_VERBOSE(fmt, ...) printf(fmt,##__VA_ARGS__);fflush(stdout);
#define LOG_DEBUG(fmt,...) printf(fmt,##__VA_ARGS__);fflush(stdout);
#define LOG_WARN(fmt,...) printf(fmt,##__VA_ARGS__);fflush(stdout);
#else
#define LOG_VERBOSE(...)
#define LOG_DEBUG(...)
#define LOG_WARN(...)
#endif
#define LOG_ERROR(fmt,...) printf(fmt,##__VA_ARGS__);fflush(stdout);
文件重定向
FILE* logFile;
logFile = freopen("log.txt", "w", stdout);
//文件关闭
if (!logFile) {
fclose(logFile);
}
后面printf()的内容就会写入到log.txt中
分析
先解释一下 VA_ARGS 宏
我理解也不是很好,我理解是一个多参数的宏。
https://blog.csdn.net/bat67/article/details/77542165对stdout 和 printf 缓冲区的解释
http://seanchense.github.io/2018/10/05/cache-policy-behind-printf-stdout/
所以如果用 stdout重定向的话,缺点是不能输出多个参数。
LOG_VERBOSE(" only one parameters !\n");
用printf可以输出多个参数,但是变成全缓冲区,我们希望及时写入文件,所以增加了fflush(),满足了上面三个要求。