调用特定于函数的函数,具体取决于C中的宏参数

时间:2019-05-29 20:19:24

标签: c macros

我有多个功能,它们的标识符非常相似(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 个答案:

答案 0 :(得分:1)

如果保证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是一个复杂表达式,或者直到运行时才知道,这种方法仍然有效。

答案 1 :(得分:0)

也许使用串联运算符(##

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

目前尚不清楚为什么这是必要的-为什么不直接键入call1()而不是call(1)。这对基于变量动态选择正确的函数进行调用没有帮助。为此,您需要条件逻辑。

switch (n) {
    case 1: call1(); break;
    case 2: call2(); break;
    default: ...; break;
}