我正在寻找一个打印日志信息的函数,以便调试我的程序。这个函数必须查看一个布尔值,并决定是将日志写入文件还是写入控制台。
int useFile;
int log_informations( ? )
{
if(useFile)
{
// open/close FILE *pf omitted
fprintf(pf, ? );
}
else
{
printf( ? );
}
return 0;
}
int main()
{
int answer = 42;
log_informations("The answer is %d.", answer);
return 0;
}
你能帮我输入参数吗?我没有找到任何参考。
注意:在这个问题中,我把事情弄得很清楚和简单,因为它们在我的上下文中,所以我不需要变通,但可能,一个简单的答案。
提前谢谢你;)
正如前面提到的,您不需要实际编写一个函数。宏可以在这里提供帮助:
#define LOG(fmt, ...) fprintf(logToFile ? fileLogger : stdout, fmt, ##__VA_ARGS__)
要回答你的问题,你可以看看printf
和vprintf
是如何工作的:
int printf(const char *format, ...);
int vprintf(const char *format, va_list arg);
printf
是一个可变函数,你想提供你自己的版本来包装vprintf
和vfprintf
。
#include <stdarg.h> // needed for va_list, va_start, and va_end.
int my_printf(const char *format, ...)
{
va_list ap;
int ret;
va_start(ap, format);
if (useFile) ret = vfprintf(pf, format, ap);
else ret = vprintf(format, ap);
va_end(ap);
return ret;
}
EDIT:正如@phuclv提到的,如果您想在日志中包含文件、行和/或函数信息,那么宏是唯一的方法。例如,对于追加文件和行信息,您可以这样做:
#define LOG(fmt, ...) fprintf(logToFile ? fileLogger : stdout, __FILE__ ":" STRINGIFY(__LINE__) " " fmt, ##__VA_ARGS__)
#define STRINGIFY_HELPER(x) #x
#define STRINGIFY(x) STRINGIFY_HELPER(x)
__LINE__
需要STRINGIGY
,因为它是int
。