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

时间:2015-07-10 09:27:11

标签: 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
}

到目前为止一切顺利!

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

/* module2.c */

#include <module1.h>

const my_struct_t arrayOfMyStruct[] = {
   { myStruct1.funcPtr1, myStruct1.funcPtr2 },
   // ...
}

编译器抛出错误并说,表达式"myStruct1.funcPtr1""myStruct1.funcPtr2"不是常量。
有什么问题?

1 个答案:

答案 0 :(得分:2)

使用限定符const声明

myStruct1,但它不是常量。静态初始化要求它,arrayOfMyStruct具有静态存储持续时间。

  

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

您可以直接使用这些功能对其进行初始化:{ func1, func2 },

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

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

typedef struct 
{
   void (*const *funcPtr1)(void);
   void (*const *funcPtr2)(void);
} my_struct2_t;

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

(*arrayOfMyStruct[0].funcPtr2)();