c - 如何在 fprintf 中使用 Variadic 宏

标签 c printf c-preprocessor variadic variadic-macros

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

#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/

相关文章:

c - 使用 increment(*p++ = x) 取消引用指针会将 *p 的值更改为 p

c - 将文本文件中的字符串扫描到数组中时出现问题

c - 常量表达式中的整数溢出

python - 不允许操作 : Server-setsockopt() error for SO_BINDTODEVICE

c - 在 for 循环中使用 printf( )

c - 无法理解以下代码中的 scanf() 行为

c - 寻找表生成宏惯用语的良好解释

c - 如何在预处理器#if 条件中捕获未定义的宏?

c - 编码解码请发现故障

c - 宏与静态内联?