我正在尝试通过编写宏将日志打印到文件中。 我的宏如下所示:
#define LOG(fmt,...){\
FILE *F;\
F = fopen("output.txt","a");\
fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}
并且我计划按以下格式调用 LOG:
LOG("values are : %d %d",num1,num2);
编译的时候报错
error: expected expression before ‘,’ token
fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}
谁能解释一下我哪里出错了?
最佳答案
首先,您必须将宏包装到一个 do-while 循环中,这样它才能正确地用表达式处理。
#define LOG( fmt , ... ) do{ }while(0)
然后您必须确保 fopen() 调用成功并在使用后关闭文件。
FILE* f = fopen( "output.txt" , "a" ) ;
if( !f )
break ; //break works because you are in a loop
fclose( f ) ; //also flushes the stream
然后将打印包含在完整的宏中。
#define LOG( fmt , ... ) \
do{ \
FILE* f = fopen( "output.txt" , "a" ) ; \
if( !f ) \
break ; \
fprintf(f, fmt" %s %d\n",__VA_ARGS__,__FILE__,__LINE__); \
fclose( f ) ; \
}while( 0 )
调用的形式是:
LOG("values are : %d %d",4444,55555);
您必须至少输入一个正确的可选参数,并在字符串中使用相应的标志。
关于c - 如何在 fprintf 中使用 Variadic 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305086/