【问题标题】:assigning function pointer to array of function pointers [duplicate]将函数指针分配给函数指针数组[重复]
【发布时间】:2018-08-24 03:19:00
【问题描述】:

在下面的代码中,我试图将函数指针分配给函数指针数组。我收到错误消息

错误:初始值设定项元素不是常量,然后一个注释说“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;
}

【问题讨论】:

  • 在 main 中,您是在声明,而不是在分配。试试fptr = function1;
  • main 中,您在运行时进行了初始化。与赋值一样,这里不需要常量表达式。对于具有静态持续时间的数据对象的初始化,您需要一个常量表达式。
  • ...因此void (*stateTable2[]) (void) = {function1,fptr}; -> void (*stateTable2[]) (void) = {function1, function2};

标签: c arrays static initialization function-pointers


【解决方案1】:

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

要么像这样声明数组

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

或移动声明

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

在 main 内部将数组作为具有自动存储持续时间的数组。

这是一个演示程序。

#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:您可能需要详细说明您的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多