嵌套包装功能

时间:2019-06-20 23:51:17

标签: c

假设我具有以下功能:

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 :(得分:-2)

可以很干净地使用类似于函数的宏来避免参数问题:

#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);;