C预处理器在运行时?

dri*_*ker 1 c macros

我想做一个令牌连接,但我想用变量的内容而不是它的名字来做这个.像这样.

#define call_function(fun, number) fun##_##number ()

while (i < 10 ) { call_function(fun, i); }

但我给fun_number(),我想给fun_1,fun_2,等等...

怎么做?

关于函数指针.

我正在步行处理ascii caracters上的用户输入,我的选项是&*^> <等等,最多十个令牌.

要在带有函数指针的数组中处理它,我需要创建一个包含127个块的数组,只有十个令牌!

这太贵了!谢谢你的所有答案.

提前致谢!!!

ken*_*ytm 5

#define call_function(fun, member) fun##_##number ()
// ------------------------^
// should be "number".
Run Code Online (Sandbox Code Playgroud)

即便如此,你也只会得到fun_i.您无法在运行时调用预处理器宏,因为它们仅用于预处理(甚至在解析和编译之前).

您需要手动扩展循环.

call_function(fun, 0);
call_function(fun, 1);
call_function(fun, 2);
call_function(fun, 3);
call_function(fun, 4);
call_function(fun, 5);
call_function(fun, 6);
call_function(fun, 7);
call_function(fun, 8);
call_function(fun, 9);
Run Code Online (Sandbox Code Playgroud)

或使用__COUNTER__(需要gcc≥4.3):

#define CONCAT3p(x,y,z) x##y##z
#define CONCAT3(x,y,z) CONCAT3p(x,y,z)
#define call_function(func) CONCAT3(func, _, __COUNTER__)()

call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
call_function(fun);
Run Code Online (Sandbox Code Playgroud)

  • 开关不慢.大多数编译器都会使用跳转表,除非在分支时可能会使用很少的替代方法. (3认同)

pm1*_*100 5

你需要创建一个函数指针数组并调用该数组.

 typedef int (*pfunc)(int);
 pfunc[] = {func0,func1,func2,func3};
 for(int i = 0; i < 3; i++)
 {
     pfunc[i](arg);
  }
Run Code Online (Sandbox Code Playgroud)

我确信我的语法有问题 - 请查看http://www.newty.de/fpt/fpt.html