我有多个功能,它们的标识符非常相似(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);
}
如果还有其他我不知道的方法,或者您可以用另一种方法显示我的想法。如果可能的话,我想坚持使用宏
答案 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;
}