无法使用包含函数指针的结构初始化数组-error:initializer元素不是常量

时间:2015-02-20 19:26:53

标签: c arrays const function-pointers array-initialization

我正在尝试初始化一个结构数组。该结构包含一个函数指针作为其数据成员之一。但我的编译器给我一个错误,抱怨初始化元素不是常量。如何使用我声明的函数指针初始化数组?

typedef void (*write_func_ptr_t)( void**, size_t*, char*, const size_t);
typedef bool (*read_func_ptr_t)( char*, const void*, const size_t);

write_func_ptr_t generate_basic_msg_ptr;
read_func_ptr_t handle_basic_msg_ptr;
write_func_ptr_t generate_reg_msg_ptr;
read_func_ptr_t handle_reg_msg_ptr;

struct supported_msg_info
{
    const char* const type;
    const write_func_ptr_t write_func;
    const read_func_ptr_t read_func;
};

static struct supported_msg_info SUPP_MESSAGES[] = {
    { "basic", generate_basic_msg_ptr, handle_basic_msg_ptr },
    { "registration", generate_reg_msg_ptr, handle_reg_msg_ptr }
};

2 个答案:

答案 0 :(得分:2)

你可以这样做,添加函数声明并使它们匹配像

这样的函数指针类型
void generate_basic_msg_ptr(void **, size_t *, char *, const size_t);
bool handle_basic_msg_ptr(char *, const void *, const size_t);
void generate_reg_msg_ptr(void **, size_t *, char *, const size_t);
bool handle_reg_msg_ptr(char *, const void *, const size_t);

但是根据你的评论

  

使用dlsym - agranum 59秒前,函数的定义将在运行时从共享库中提取

你真正需要的是这个

struct supported_msg_info
{
    const char *const type;
    /* remove the const qualifier */
    write_func_ptr_t write_func;
    read_func_ptr_t read_func;
};

static struct supported_msg_info SUPP_MESSAGES[] = {
    {"basic", NULL, NULL},
    {"registration", NULL, NULL}
};

然后当你致电dlsym时,你可以这样做

SUPP_MESSAGES[0].write_func = dlsym(dlhandle, "symbol_name");

然后将使用SUPP_MESSAGES[0].write_func定义和函数指针struct指定的签名调用函数poitner typedef,并记住void *是可转换的对于没有强制转换的任何类型的指针,所以这就是你所需要的。

答案 1 :(得分:0)

generate_basic_msg_ptr和朋友只是甚至没有初始化的变量(严格来说,他们可能已被初始化为零,但可能不是你的意图)。因此它们没有编译时定义的值,显然不能用于数组初始化。您可能希望声明void func(<whatever>);之类的函数,并在初始化中使用func