C - 动态函数调用

时间:2014-03-27 23:30:41

标签: c dynamic-function

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

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;
}

但我不确定如何继续使用&#34; i&#34;设置测试指针。

3 个答案:

答案 0 :(得分:1)

在linux上

将函数放在一个单独的共享库(.so)中。然后使用dlopen打开它并使用dlsym来获取一个名称为

的函数指针

在Windows上

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

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

答案 1 :(得分:0)

你可以做的是定义一个包含所有函数的函数指针数组,然后循环遍历数组的所有元素。

int (*array[])(void) = {test1, test2, test3};

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