如何使结构常量中的函数指针用于初始化常量数组?

mom*_*i89 5 c arrays struct initialization constants

我有以下常量结构,它包含函数指针:

/* module1.h */

typedef struct my_struct my_struct_t;

struct my_struct
{
   void (*funcPtr1)(void);
   void (*funcPtr2)(void);
}

extern const my_struct_t myStruct1;



/* module1.c */

#include <module1.h>

static void func1(void)
{
   // do something
}

static void func2(void)
{
   // do something else
}

const my_struct_t myStruct1 = {
   .funcPtr1 = &func1,
   .funcPtr2 = &func2
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好!

现在我想创建一个上面结构的常量数组,并从结构的实例中分配函数指针:

/* module2.c */

#include <module1.h>

const my_struct_t arrayOfMyStruct[] = {
   { myStruct1.funcPtr1, myStruct1.funcPtr2 },
   // ...
}
Run Code Online (Sandbox Code Playgroud)

编译器会引发错误,并表示,该表达式"myStruct1.funcPtr1""myStruct1.funcPtr2"没有恒定的.
怎么了?

thi*_*his 2

myStruct1用限定符 const 声明,但它不是常量。静态初始化要求它是静态初始化,并且arrayOfMyStruct具有静态存储持续时间。

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式都应是常量表达式或字符串文字。

您可以直接使用函数初始化它:{ func1, func2 },

或获取指针的地址:{ &myStruct1.funcPtr1, &myStruct1.funcPtr2 },

在这种情况下,您将必须为数组使用不同的结构类型:

typedef struct 
{
   void (*const *funcPtr1)(void);
   void (*const *funcPtr2)(void);
} my_struct2_t;
Run Code Online (Sandbox Code Playgroud)

并且调用该函数的语法必须更改:

(*arrayOfMyStruct[0].funcPtr2)();
Run Code Online (Sandbox Code Playgroud)