У меня есть две версии функции C, которые обмениваются друг с другом с точки зрения скорости и использования памяти. Эти функции находятся в файле.cpp, который используется совместно несколькими программами. Я хочу использовать указатель на функцию, чтобы я мог переключаться между двумя реализациями и выполнять эти изменения во всех файлах моей программы.
Combination.h(extract)
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(extract)
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(extract)
int main(int argc, char* argv []) {
choose = chooseLookup;
choose(10, 5);
foo(10, 5);
}
Выход:
Lookup
Recursive
Почему функция foo не использует selectLookup вместо selectRecursive? Как это исправить? Есть ли лучший подход, который я могу использовать для достижения той же цели?
Заранее спасибо за вашу помощь!
При существующем положении вещей, каждый файл.cpp, который включает в себя Combination.h имеет свой собственный static
переменной choose
. Ваш код в main
обновлениях копирует main.cpp, но не версию в Combination.cpp.
Один простой способ исправить это - изменить Combination.h, чтобы объявить choose
как extern
extern long (*choose)(int, int);
затем реализовать/инициализировать это в Combination.cpp
long (*choose)(int, int) = chooseRecursive;
choose
глобальную переменную, которая используется везде?choose
, чтобы быть глобальным