Я хочу реализовать следующий макрос:
ASSERT(condition, ...)
Что определяется так:
1. Если он получает только один параметр - если условие ложно, мы просто печатаем «условие ложно».
2. Если он получает два параметра или больше - то же, что и выше, и дополнительно: вторым аргументом будет формат печати (аналогично формату printf), а остальные аргументы будут для формата печати (опять же, как и printf) , Таким образом, в дополнение к возможной печати «условие ложно», он также напечатает формат, как printf.
Примеры:
ASSERT (0):
condition is false
ASSERT (1):
(empty output)
ASSERT (0, "привет"):
condition is false
hi
ASSERT (0, "число семь:% d", 7):
condition is false
number seven: 7
Моя проблема здесь в том, что я не знаю, как поддержать случай нулевых переменных аргументов. Если бы я знал, что получу по крайней мере два параметра - я мог бы реализовать это, как показано в коде ниже, но это не так.
Как я могу изменить код ниже для поддержки того, что мне нужно?
#define ASSERT(condition, format,...) do { \
if (!(condition)) { \
printf(format, ##__VA_ARGS__); \
} \
} while (0)