如何用多个语句定义ac宏

pam*_*bda 1 c unix linux macros c-preprocessor

我试图定义一个有两行/语句的宏,它就像:

#define FLUSH_PRINTF(x) printf(x);fflush(stdout);
Run Code Online (Sandbox Code Playgroud)

但由于C宏无法与';'一起使用,因此无法正常工作.

有没有合理的解决方法?

PS: 我知道上面的例子很奇怪,我应该使用类似普通函数的东西. 但这只是一个简单的例子,我想问一下如何定义一个多语句宏.

zwo*_*wol 6

这是使用这个do { ... } while (0)成语的合适时间.这也是使用可变参数宏参数的合适时间.

#define FLUSH_PRINTF(...) \
    do { \
        printf(__VA_ARGS__); \
        fflush(stdout); \
    } while (0)
Run Code Online (Sandbox Code Playgroud)

您也可以使用包装函数执行此操作,但由于使用时需要额外的样板,因此输入更多vprintf.

 #include <stdarg.h>
 #include <stdio.h>

 /* optional: */ static inline 
 void
 flush_printf(const char *fmt, ...)
 {
     va_list ap;
     va_start(ap, fmt);
     vprintf(fmt, ap);
     va_end(ap);
     fflush(stdout);
 }
Run Code Online (Sandbox Code Playgroud)