Переменная C макрофункция - PullRequest
0 голосов
/ 19 ноября 2018

Что происходит в этом макросе? Я понимаю, что #test расширяет этот параметр до буквального текста. Но что делают pre; и test;?

#define MACRO_FN(test, pre, repeat, size)    \
  do {                                     \
    printf("%s: ", #test);                 \
    for (int i = 0; i < repeat; i++) {     \
      pre;                                 \
      test;                                \
    }                                      \
  } while (0)

Это используется как

MACRO_FN(a_func(an_array, size),, var1, size);

Что здесь означают двойные запятые?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Вот минимальный пример:

#define repeat 5    // I added this, because 'repeat' is not mentionned in your question

#define MACRO_FN(test, pre, var1, size)    \
  do {                                     \
    printf("%s: ", #test);                 \
    for (int i = 0; i < repeat; i++) {     \
      pre;                                 \
      test;                                \
    }                                      \
  } while (0)

void foo()
{
}

void func(int a, int b)
{
}

int main()
{
  MACRO_FN(func(2, 3), foo(), var1, size);
}

После предварительной обработки код эквивалентен следующему:

int main()
{
  printf("%s: ", "func(2,3)");
  for (int i = 0; i < 5; i++)
  {
    foo();
    func(2, 3);
  }
}

Таким образом, этот макрос является оберткой, которая печатает имя функции плюс ее параметры, когда она вызывается с макросом и выполняет эту функцию, указанную в первом параметре repeat раз (независимо от того, repeat есть). Если второй параметр пропущен, функция с таким именем просто не вызывается перед функцией, упомянутой ранее, как в следующем примере:

int main()
{
  MACRO_FN(func(2, 3),, var1, size);
}

После предварительной обработки код эквивалентен следующему:

int main()
{
  printf("%s: ", "func(2,3)");
  for (int i = 0; i < 5; i++)
  {
    ;
    func(2, 3);
  }
}

Примечание

Я удалил do while(0) из эквивалентных программ для краткости, прочитайте эту статью SO для получения дополнительной информации:

0 голосов
/ 19 ноября 2018

pre и test кажутся двумя функциями.Основываясь на том, как это написано, мы можем догадаться, что pre - это функция, вызываемая до test.

. Двойная запятая не имеет особого значения.Именно здесь, потому что второй параметр (pre) был опущен.

Редактировать: В качестве примечания, такого рода макрос "следует избегать, как чума", как сказал @Lundin.

...