У меня есть несколько функций с очень похожими идентификаторами (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);
}
если есть другие методы, которых я не знаю, или вы можете сделать это по-другому, покажите мне свои идеи. если возможно, я хотел бы придерживаться макросов
Возможно, используйте оператор конкатенации (##
)
#define call(N) call##N()
Непонятно, зачем это нужно — почему бы просто не ввести call1() вместо call(1). Это не поможет при динамическом выборе правильной функции для вызова на основе переменной. Для этого вам понадобится условная логика.
switch (n) {
case 1: call1(); break;
case 2: call2(); break;
default: ...; break;
}
да я забыл поставить рис в посте сейчас обновляется
до сих пор я использовал переключатель, но я хотел избежать длинных частей кода
Понятно, поэтому в этом случае, возможно, определите функцию call
, которая реализует switch
, как указано выше, или if/else
для вызова правильной базовой функции на основе значения аргумента во время выполнения.
Если 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
является сложным выражением или может быть неизвестно до времени выполнения.
хорошая идея, я просто работаю над этим, дайте мне немного времени. сейчас ночь, я опубликую результат на следующий день
Используйте оператор вставки токенов.