使用函数指针在函数实现之间切换

时间:2013-10-07 16:04:53

标签: c++ c function-pointers

我有两个版本的C函数,在速度和内存使用方面相互权衡。这些函数位于.cpp文件中,该文件在多个程序之间共享。我想使用一个函数指针,以便我可以在两个实现之间来回切换,并让这些更改贯穿我程序中的所有文件。

Combination.h(摘录)

long chooseRecursive (int n, int r);
long chooseLookup (int n, int r);
void foo (int n, int r);
static long (*choose)(int, int) = chooseRecursive;

Combination.cpp(摘录)

long chooseRecursive (int n, int r) { cerr << "Recursive\n"; }
long chooseLookup (int n, int r) { cerr << "Lookup\n"; }
void foo (int n, int r) { choose(n, r); }

Main.cpp(摘录)

int main(int argc, char* argv []) {
    choose = chooseLookup;
    choose(10, 5);
    foo(10, 5);
}

输出结果为:

Lookup
Recursive

为什么foo函数不使用chooseLookup而不是chooseRecursive?我该如何解决?有没有更好的方法可以用来实现同样的目标?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

根据情况,包含Combination.h的每个.cpp文件都有自己的static变量choose。您在main中的代码更新了main.cpp的副本,但没有更新Combination.cpp中的版本。

解决此问题的一种简单方法是更改​​Combination.h以将choose声明为extern

extern long (*choose)(int, int);

然后在Combination.cpp中实现/初始化

long (*choose)(int, int) = chooseRecursive;