Если N
гарантированно будет цифрой 1, 2 или 3, можно использовать
#define call(N) func##N()
, но это может завершиться ошибкой, если N
может иметь другие формы.Если единственная другая возможность, которую необходимо учесть, это то, что N
может быть макросом, который расширится до одной цифры, можно использовать:
#define do_call(N) func##N()
#define call(N) do_call(N)
В качестве альтернативы, можно учесть N
вычисляется произвольным образом, если код был написан как:
void (*const funcs[3])(void) = {func1, func2, func3};
void call(int n)
{
funcs[n-1]();
}
Если функции возвращают значение или принимают параметры, замените начальный void
типом возвращаемого значения и / или замените (void)
насписок параметров.Этот подход будет работать, даже если значение N
является сложным выражением или может быть неизвестно до времени выполнения.