如何使用多个语句定义c宏

时间:2018-05-17 14:17:39

标签: c linux unix macros c-preprocessor

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

#define FLUSH_PRINTF(x) printf(x);fflush(stdout);

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

有合理的解决方法吗?

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

3 个答案:

答案 0 :(得分:5)

这是使用do { ... } while (0)成语的合适时间。 这也是使用variadic macro arguments的合适时间。

#define FLUSH_PRINTF(...) \
    do { \
        printf(__VA_ARGS__); \
        fflush(stdout); \
    } while (0)

您也可以使用包装函数执行此操作,但由于使用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);
 }

答案 1 :(得分:0)

在宏中使用多个表达式

#define FLUSH_PRINTF(x) (printf(x), fflush(stdout))

答案 2 :(得分:-2)

最好的解决方案是编写一个函数。我不明白为什么你首先需要一个宏。

至于如何使用宏,只需将其包装在{}

#define FLUSH_PRINTF(x) { printf(x);fflush(stdout); }

根据C11 6.8,这完全没问题,导致复合语句

statement:
  labeled-statement
  compound-statement
  expression-statement
  selection-statement

如果您希望允许危险样式if语句没有大括号(坏主意),例如:

if(x)
  FLUSH_PRINTF(x);
else
  FLUSH_PRINTF(y);

然后你必须使用do while(0)技巧来包装宏:

#define FLUSH_PRINTF(x) do { printf(x);fflush(stdout); } while(0)