Обычная идиома - использовать do { ... } while (0)
(некоторые компиляторы генерируют предупреждение для этого) или оператор запятой ,
и заключать ваши операторы в круглые скобки (но вы не можете использовать и управлять оператором потока).
Если вы можете рассчитывать на наличие современного компилятора (например, GCC 3+), вы можете использовать переменные макросы для определения макроса так, чтобы он был похож на обычный printf
.
Я бы пошел начто-то вроде:
#define PTF(...) (fprintf(file,__VA_ARGS__),printf(__VA_ARGS__))
, так что PTF("Round %d",y)
напечатает Round 9
(при условии, что y = 9) как на file
, так и на stdout
.
Обычное предупреждение на стороне-эффекты в макросах применяются: никогда, никогда не используйте PTF("%d",y++)
.