将函数指针分配给函数指针数组

4
在下面的代码中,我试图将函数指针分配给函数指针数组。我收到错误消息:
error:initializer element is not constant,然后附近的注释说“初始化stateTable2 [1]”。
在main中,我尝试将函数指针分配给另一个函数指针,没有问题。
void function1 (void) // Function definition
{

}

void function2 (void) // Function definition
{

}

void (*fptr)(void) = function2;

void (*stateTable2[]) (void) = {function1,fptr};

int main()
{
    void(*fp)(void) = fptr;
    return 0;
}

在主函数中,你正在声明而不是赋值。只需尝试 fptr = function1; - Mawg says reinstate Monica
2
main 函数中,您可以进行运行时初始化。与赋值一样,在此处您不需要常量表达式。对于具有静态持续时间的数据对象的初始化,您需要一个常量表达式。 - Gerhardh
1
因此 void (*stateTable2[]) (void) = {function1,fptr}; -> void (*stateTable2[]) (void) = {function1, function2}; - Jabberwocky
1个回答

5

您不能使用非常量对象初始化具有静态存储期的数组。

可以像这样声明数组:

void (*stateTable2[]) (void) = { function1, function2 };

或将声明移动

void (*stateTable2[]) (void) = {function1,fptr};

在主函数内,将数组声明为具有自动存储期的数组。

以下是一个演示程序。

#include <stdio.h>

void function1 (void) // Function definition
{
    printf( "Hello " );
}

void function2 (void) // Function definition
{
    puts( "World!" );
}

void (*fptr)(void) = function2;

int main(void) 
{
    void ( *stateTable2[] ) (void) = { function1, fptr };
    void(*fp)(void) = fptr;

    fp();

    for ( size_t i = 0; i < sizeof( stateTable2 ) / sizeof( *stateTable2 ); i++ )
    {
        stateTable2[i]();
    }

    return 0;
}

它的输出是

World!
Hello World!

预处理器为什么能够理解函数名,但不能理解函数指针?我认为在预处理期间初始化fptr(因此在编译时已知)。但事实并非如此。 - Rajesh
@Rajesh:你可能需要更详细地阐述你的意思。 - stephanmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接