函数指针缓冲区?
Buffer of function pointers?
我知道这听起来可能很科幻,但我真的想调用一个函数 x 次,方法是使用指向它的函数指针数组,而不涉及循环或任何可能减慢目标程序的事情。这可能吗?如果可能,具体如何?
这是一个深度受限递归的例子
void hello( int depth )
{
printf( "hello %2d\n", depth );
if ( depth > 1 )
hello( depth - 1 );
}
int main()
{
hello( 10 ); // call the hello function 10 times
hello( 17 ); // call the hello function 17 times
}
下面是使用跳转多次调用函数指针的示例table。请注意,对于跳转 table,最大调用次数受限于跳转 table 的大小(本例中为 10),而对于递归,调用次数仅受堆栈大小限制。
int hello( int n )
{
n++;
printf( "hello %2d\n", n );
return n;
}
void executeFunction( int (*func)(int), int count )
{
int n = 0;
switch ( count )
{
case 10: n = (*func)(n);
case 9: n = (*func)(n);
case 8: n = (*func)(n);
case 7: n = (*func)(n);
case 6: n = (*func)(n);
case 5: n = (*func)(n);
case 4: n = (*func)(n);
case 3: n = (*func)(n);
case 2: n = (*func)(n);
case 1: n = (*func)(n);
}
}
int main()
{
executeFunction( hello, 3 ); // call the hello function 3 times
executeFunction( hello, 9 ); // call the hello function 9 times
}
您可以使用预处理器将宏扩展为 x 次函数调用。您的代码会变得更大,但您仍然 运行 函数 x 次。它不会为你赢得任何东西。
#define REPEAT5(x) { x; x; x; x; x; }
请注意,您不能像调用函数一样调用该宏(如果您以分号结束调用,它将扩展为语法错误)。一个更干净的宏(尽管在这种情况下,这有什么关系?)将是:
#define REPEAT5(x) do { x; x; x; x; x; } while(0)
然后你可以像调用函数一样调用宏,但它扩展为一个循环,你说你不喜欢循环。
我知道这听起来可能很科幻,但我真的想调用一个函数 x 次,方法是使用指向它的函数指针数组,而不涉及循环或任何可能减慢目标程序的事情。这可能吗?如果可能,具体如何?
这是一个深度受限递归的例子
void hello( int depth )
{
printf( "hello %2d\n", depth );
if ( depth > 1 )
hello( depth - 1 );
}
int main()
{
hello( 10 ); // call the hello function 10 times
hello( 17 ); // call the hello function 17 times
}
下面是使用跳转多次调用函数指针的示例table。请注意,对于跳转 table,最大调用次数受限于跳转 table 的大小(本例中为 10),而对于递归,调用次数仅受堆栈大小限制。
int hello( int n )
{
n++;
printf( "hello %2d\n", n );
return n;
}
void executeFunction( int (*func)(int), int count )
{
int n = 0;
switch ( count )
{
case 10: n = (*func)(n);
case 9: n = (*func)(n);
case 8: n = (*func)(n);
case 7: n = (*func)(n);
case 6: n = (*func)(n);
case 5: n = (*func)(n);
case 4: n = (*func)(n);
case 3: n = (*func)(n);
case 2: n = (*func)(n);
case 1: n = (*func)(n);
}
}
int main()
{
executeFunction( hello, 3 ); // call the hello function 3 times
executeFunction( hello, 9 ); // call the hello function 9 times
}
您可以使用预处理器将宏扩展为 x 次函数调用。您的代码会变得更大,但您仍然 运行 函数 x 次。它不会为你赢得任何东西。
#define REPEAT5(x) { x; x; x; x; x; }
请注意,您不能像调用函数一样调用该宏(如果您以分号结束调用,它将扩展为语法错误)。一个更干净的宏(尽管在这种情况下,这有什么关系?)将是:
#define REPEAT5(x) do { x; x; x; x; x; } while(0)
然后你可以像调用函数一样调用宏,但它扩展为一个循环,你说你不喜欢循环。