如何在自定义printf中使用参数const char*格式

如何在自定义printf中使用参数const char*格式,c,printf,C,Printf,我正在寻找一个打印日志信息的函数,以便调试我的程序。 此函数必须查看布尔值并决定是将日志写入文件还是写入控制台 int useFile; int log_informations( ? ) { if(useFile) { // open/close FILE *pf omitted fprintf(pf, ? ); } else { printf( ? ); } return 0; } int main() { int answer

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

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;
}
你能帮我弄一下参数吗?我没有找到任何参考资料

注意:在这个问题上,我把事情说得很清楚,也很简单,因为我的背景是这样的,所以我不需要解决问题,但可能需要一个简单的答案


先谢谢你;)

正如其他人提到的,您不需要实际编写函数。宏可以帮助您:

#定义LOG(fmt,…)fprintf(logToFile?文件记录器:stdout、fmt、#VA#ARGS)
要回答您的问题,您可以查看
printf
vprintf
的工作原理:

intprintf(常量字符*格式,…);
int vprintf(常量字符*格式,va_列表参数);
printf
是一个,您希望提供自己的版本,其中包含
vprintf
vfprintf

#包括//va_列表、va_开始和va_结束所需。
int my_printf(常量字符*格式,…)
{
va_列表ap;
int ret;
va_开始(ap,格式);
如果(useFile)ret=vfprintf(pf,format,ap);
else ret=vprintf(格式,ap);
va_端(ap);
返回ret;
}
编辑:正如@phuclv提到的,如果您想在日志中包含文件、行和/或函数信息,宏是唯一的方法。例如,要附加文件和行信息,可以执行以下操作:

#定义LOG(fmt,…)fprintf(logToFile?文件记录器:标准输出,uuuu文件):“字符串化(uuu行);#fmt,uuuu参数)
#定义STRINGIFY_HELPER(x)#x
#定义STRINGIFY(x)STRINGIFY\u HELPER(x)

你需要
stringy
,因为它是
int

你需要使用vfprintf或vprintf。无关:你可以
fprintf()
stdout
<代码>fprintf(usefile?pf:stdout,“…”,…)和宏是在C语言中获取行号、文件名和函数名的唯一方法,所以日志功能几乎总是使用宏:
\define LOG(fmt,…)fprintf(logToFile?fileLogger:stdout,fmt“[”\uuuuuuu file\uuuuuuuuuu:“\uuuuuu line\uuuuuuuuuuuuuu”:”],\uufunc\u35; VA\uu ARGS
\uuuuuuu行通常是一个
(不确定标准是怎么说的,但在GCC、clang和MSVC中就是这样)。您可以使用常用的宏技巧将其字符串化:
#define stringify_HELPER(x)#x#define stringify(x)stringify_HELPER(x)