调用特定功能取决于 C 中的宏参数



我有多个具有非常相似的标识符的函数(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);
}

如果还有其他我不知道的方法,或者你可以用另一种方式告诉我你的想法。 如果可能的话,我想坚持使用宏

如果保证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是复杂表达式或直到运行时才知道,此方法也有效。

也许使用连接运算符 ( ## (

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

目前还不清楚为什么这是必要的 - 为什么不只输入 call1(( 而不是 call(1(。这无助于根据变量动态选择要调用的正确函数。为此,您需要条件逻辑。

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

最新更新