函数指针缓冲区?

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)

然后你可以像调用函数一样调用宏,但它扩展为一个循环,你说你不喜欢循环。