根据参数调用不同函数的宏

Macro that calls different function based on parameter

本文关键字:函数 参数 调用      更新时间:2023-10-16

大家好,我在使用宏时遇到了麻烦,所以我想我会练习,我正在看##宏操作符,我想我可以用它来解决我的问题,我不想根据参数调用多个函数,例如,如果我有一个宏,像这样:

#define macro(a) func##a();

int main()
{
   .....
   for(int i = 0;i< length;i++)
   {
      macro(i)
   }

func1()
{

}
....
func31()
{

}

谁知道我怎么才能做到这一点??

只能组合两个预处理器令牌。然而,func不是一个预处理器令牌。您需要跳过一个额外的环,调用某种形式的"concat"宏:

#define CONCAT(a, b) a ## b
#define macro(a) CONCAT(func,a)

当然,你的宏产生的令牌不会是func1,…func31(当然,如果你的逻辑是正确的,他们也需要从func0开始),而不是funci。宏的扩展发生在编译开始时,而for -循环的执行发生在运行时(一些优化可能会将其提升到编译时,但这不会影响宏)。

如果您需要与宏一起展开整数序列,您可能需要查看Boost预处理器库,特别是BOOST_PP_REPEAT功能。

如果您只需要静态地将整数序列展开为函数调用,您也可以考虑查看在整数上模板化的函数模板:在尝试使用预处理器库之前,我当然会考虑使用使用模板的方法…