Вложенные функции упаковки - PullRequest
0 голосов
/ 21 июня 2019

Предположим, у меня есть следующие функции:

void DUT(void){
   /* Something under test*/
}

void loop_wrapper(void (*func)()){
  for(int i = 0; i<5000; i++)
    func();
}

void time_wrapper(void (*func)()){
  clock_t start, end;
  double cpu_time_used;
  start = clock();

  func();

  end = clock();
  cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC * 1000;
  printf("Execution time %f ms\n", cpu_time_used);
}

int main(void){
  time_wrapper(DUT);
}

В коде было бы невозможно обернуть DUT обеими обертками.Такой вызов может выглядеть как time_wrapper(loop_wrapper(DUT));.Это было бы недопустимо, потому что time_wrapper принимает указатель на функцию без аргументов.

Есть ли удобный способ разрешить вызов ни одного, одного или нескольких таких упаковщиков во вложенном виде?

1 Ответ

0 голосов
/ 21 июня 2019

Функционально-подобные макросы могут быть использованы достаточно чисто, чтобы обойти проблему аргумента:

#define loop_wrapper(func)    \
  for(int i = 0; i<5000; i++){func;}


#define time_wrapper(func) \
  clock_t start, end;      \
  double cpu_time_used;    \
  start = clock();         \
  func;                    \
  end = clock();           \
  cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC * 1000; \
  printf("Execution time %f ms\n", cpu_time_used);

int main(void){
  time_wrapper(loop_wrapper((DUT()));
}

Выходная информация препроцессора будет сведена к одной строке.Не должно быть проблемой, так как этот вывод не должен быть прочитан людьми.

clock_t start, end; double cpu_time_used; start = clock(); for(int i = 0; i<5000; i++){DUT();}; end = clock(); cpu_time_used = ((double) (end - start)) / ((clock_t) 1000000) * 1000; printf("Execution time %f ms\n", cpu_time_used);;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...