C语言 如何在自定义打印中使用参数const char *格式



我正在寻找一个打印日志信息的函数,以便调试我的程序。这个函数必须查看一个布尔值,并决定是将日志写入文件还是写入控制台。

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__)

要回答你的问题,你可以看看printfvprintf是如何工作的:

int printf(const char *format, ...);
int vprintf(const char *format, va_list arg);

printf是一个可变函数,你想提供你自己的版本来包装vprintfvfprintf

#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

相关内容

  • 没有找到相关文章

最新更新