首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在fprintf中使用Variadic宏

如何在fprintf中使用Variadic宏
EN

Stack Overflow用户
提问于 2014-10-10 17:40:55
回答 2查看 2.4K关注 0票数 0

我试图通过编写宏将日志打印到文件中。我的宏如下所示:

代码语言:javascript
复制
#define LOG(fmt,...){\
    FILE *F;\
    F = fopen("output.txt","a");\
    fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}

我计划以以下格式调用日志:

代码语言:javascript
复制
LOG("values are : %d %d",num1,num2);

但是,当我编译时,我会得到错误

代码语言:javascript
复制
error: expected expression before ‘,’ token
     fprintf(F,fmt " %s %d",__VA_ARGS__,__FILE__,__LINE__);}

有人能解释一下我哪里出了问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-10 18:20:10

首先,您必须将宏包装到一个do-while循环中,以便正确地用表达式处理它。

代码语言:javascript
复制
#define LOG( fmt , ... ) do{  }while(0)

然后,您必须确保fopen()调用成功,并且在使用后关闭文件。

代码语言:javascript
复制
FILE* f = fopen( "output.txt" , "a" ) ;
if( !f )
    break ;    //break works because you are in a loop
fclose( f ) ;    //also flushes the stream

然后,将打印包含在完整的宏中。

代码语言:javascript
复制
#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 )

呼叫的形式如下:

代码语言:javascript
复制
LOG("values are : %d %d",4444,55555);

其中必须输入至少一个正确的可选参数,并在字符串中使用相应的标志。

票数 3
EN

Stack Overflow用户

发布于 2014-10-10 17:52:42

代码语言:javascript
复制
#define LOG(fmt,...){\
    FILE *F;\
    F = fopen("output.txt","a");\
    fprintf(F,fmt " %d %d",__VA_ARGS__,__FILE__,__LINE__);}

多重问题

  1. 你从来没有fclose F。
  2. __FILE__是一个字符串。
  3. 如果你想要在没有参数的情况下调用它,__VA_ARGS__必须在最后.
  4. ..。或者用这个小黑客: #定义LOG( fmt,.){\ FILE *F;\ f= fopen("output.txt","a");\ fprintf(F,fmt“%s %d",##__VA_ARGS__,__FILE__,__LINE__)};

(##__VA_ARGS__ 是GCC扩展,如果没有args,则删除前面的逗号)。

还可以查看有关“自定义”类printf函数的this answer

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26305086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档