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