我试图通过编写宏将日志打印到文件中。我的宏如下所示:
#define LOG(fmt,...){\
FILE *F;\
F = fopen("output.txt","a");\
fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}我计划以以下格式调用日志:
LOG("values are : %d %d",num1,num2);但是,当我编译时,我会得到错误
error: expected expression before ‘,’ token
fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}有人能解释一下我哪里出了问题吗?
发布于 2014-10-10 18:20:10
首先,您必须将宏包装到一个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);其中必须输入至少一个正确的可选参数,并在字符串中使用相应的标志。
发布于 2014-10-10 17:52:42
#define LOG(fmt,...){\
FILE *F;\
F = fopen("output.txt","a");\
fprintf(F,fmt " %d %d",__VA_ARGS__,__FILE__,__LINE__);}多重问题
fclose F。__FILE__是一个字符串。__VA_ARGS__必须在最后.(##__VA_ARGS__ 是GCC扩展,如果没有args,则删除前面的逗号)。
还可以查看有关“自定义”类printf函数的this answer。
https://stackoverflow.com/questions/26305086
复制相似问题