#define call_function(fun, member) fun##_##number()
// ------------------------^
// should be "number".
即便如此,你只会得到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);
或者使用__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);
感谢您纠正我的问题。这个例子我使用了一个循环,但是在真正的问题中,我将不得不使用一个开关。这很慢。 – drigoSkalWalker 2010-03-23 20:08:38
不应该有可能有一个函数指针或一些数组?自从我考虑过C或C++代码以来,这已经过时了 – Bob 2010-03-23 20:10:09
请注意,虽然CPP不提供循环,但它不是唯一的预处理器。这只是内置的唯一一个。您可以使用更强大的预处理器(如m4)在编译时执行更复杂的工作。 – Ken 2010-03-23 20:11:17