我有两个版本的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?我该如何解决?有没有更好的方法可以用来实现同样的目标?
提前感谢您的帮助!
答案 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;