Макрос для печати переменных аргументов, с возможностью без аргументов - PullRequest
0 голосов
/ 29 октября 2018

Я хочу реализовать следующий макрос:

ASSERT(condition, ...)          

Что определяется так:
1. Если он получает только один параметр - если условие ложно, мы просто печатаем «условие ложно».
2. Если он получает два параметра или больше - то же, что и выше, и дополнительно: вторым аргументом будет формат печати (аналогично формату printf), а остальные аргументы будут для формата печати (опять же, как и printf) , Таким образом, в дополнение к возможной печати «условие ложно», он также напечатает формат, как printf.

Примеры:

  1. ASSERT (0):

    condition is false 
    
  2. ASSERT (1):

    (empty output)
    
  3. ASSERT (0, "привет"):

    condition is false
    hi
    
  4. ASSERT (0, "число семь:% d", 7):

    condition is false
    number seven: 7
    

Моя проблема здесь в том, что я не знаю, как поддержать случай нулевых переменных аргументов. Если бы я знал, что получу по крайней мере два параметра - я мог бы реализовать это, как показано в коде ниже, но это не так.
Как я могу изменить код ниже для поддержки того, что мне нужно?

#define ASSERT(condition, format,...) do { \
  if (!(condition)) { \
    printf(format, ##__VA_ARGS__); \
  } \
} while (0)

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете удалить аргумент format из этого макроса (перетяните их в переменную часть). "condition is false\n" и строка формата (если есть) будет объединена в одну строку без ##.

#include <stdio.h>

#define ASSERT(condition, ...) do { \
  if (!(condition)) { \
    printf("condition is false\n" __VA_ARGS__); \
  } \
} while (0)

int main()
{
    ASSERT(1);
    ASSERT(0);
    ASSERT(0,"Hi\n");
    ASSERT(0,"number is %d\n",7);
    return 0;
}

Ограничение:

  • format должно быть только строковый литерал, а не указатель на массив символов
...