1

我有一个测试文件,其中测试定义为

static int test1(){
    /*some tests here*/
    return 0;
}
static int test2(){
    /*some tests here*/
    return 0;
}
/*...etc*/`

我想知道是否有一种方法可以循环调用所有测试,而不是为每个测试编写调用。(有一些函数我需要在每次测试之前和之后调用,并且有超过 20 次测试,这可能会很烦人。我也一直对做这样的事情感到好奇。)

我在想类似的东西:

int main(){
    int (*test)() = NULL;
    for(i = 1; i <= numtests; i++){
      /*stuff before test*/
      (*test)();
      /*stuff after test*/
    }
    return 0;
}

但我不确定如何继续使用“i”的值来设置测试指针。

4

3 回答 3

1

在 Linux 上

将函数放在单独的共享库 (.so) 中。然后使用 dlopen 打开它并使用 dlsym 通过其名称获取函数指针

在窗户上

将函数放在一个单独的 dll 中(基本上是一样的)。然后使用 LoadLibrary 打开它并使用 GetProcAddress 获取指向函数的指针

你想做的更多的打字,但它会让你做你想做的事

于 2014-03-27T23:59:40.177 回答
0

您可以使用自包含技巧来获取函数指针列表:

#ifndef LIST_TESTS
#define TEST(name, ...) static int name() __VA_ARGS__

/* all includes go here */
#endif // ifndef LIST_TESTS

TEST(test1, {
  /* some tests here */
  return 0;
})

TEST(test2, {
  /* some tests here */
  return 0;
})

#undef TEST

#ifndef LIST_TESTS
int main(void) {
  int (*tests[])() = {
    #define LIST_TESTS
    #define TEST(name, ...) name,
    #include __FILE__
  };
  int num_tests = sizeof(tests) / sizeof(tests[0]);
  int i;

  for (i = 0; i < num_tests; ++i) {
    /* stuff before test */
    (tests[i])();
    /* stuff after test */
  }

  return 0;
}
#endif // ifndef LIST_TESTS
于 2014-03-28T01:14:08.677 回答
0

你可以做的是用你的所有函数定义一个函数指针数组,然后循环进入数组的所有元素。

int (*array[])(void) = {test1, test2, test3};
于 2014-03-27T23:33:00.573 回答