我正在尝试定义一个有两行/语句的宏,它就像:
#define FLUSH_PRINTF(x) printf(x);fflush(stdout);
但由于C宏无法与';'一起使用,因此无法正常工作。
有合理的解决方法吗?
PS:我知道上面的例子很奇怪,我应该使用类似普通函数的东西。但这只是一个简单的例子,我想问一下如何定义一个多语句宏
答案 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)