Специальная функция Callins в зависимости от макропараметра в C - PullRequest
0 голосов
/ 29 мая 2019

У меня есть несколько функций с очень похожими идентификаторами (func1 (), func2 (), func3 (), ...), и мне нужно создать макрос для вызова их всех в одном.

Я уже пытался использовать конкатенацию, но не смог понять.

void func1() {}
void func2() {}
void func3() {}

#define call(N) // here needs to go the code to call the N func like func#N()

так, чтобы позже в коде я мог сделать что-то вроде этого:

int main()
{
    for(int i = 0; i < 3; i++)
        call(i);
}

если есть другие методы, которые я не знаю, или вы можете сделать это по-другому, покажите мне свои идеи. если возможно, я бы хотел придерживаться макросов

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Если 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 является сложным выражением или может быть неизвестно до времени выполнения.

0 голосов
/ 29 мая 2019

Возможно использовать оператор конкатенации (##)

#define call(N) call##N()

Неясно, почему это было бы необходимо - почему бы просто не ввести call1 () вместо call (1). Это не поможет с динамическим выбором правильной функции для вызова на основе переменной. Для этого вам понадобится условная логика.

switch (n) {
    case 1: call1(); break;
    case 2: call2(); break;
    default: ...; break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...