Can't initialize array with struct containing function pointer -error: initializer element is not constant
Can't initialize array with struct containing function pointer -error: initializer element is not constant
我正在尝试初始化结构数组。该结构包含一个函数指针作为其数据成员之一。但是我的编译器给我一个错误,抱怨 The initializer element is not constant。如何使用声明的函数指针初始化数组?
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 }
};
generate_basic_msg_ptr
和 friends 只是甚至没有初始化的变量(好吧,严格来说它们可能已经被初始化为零,但这可能不是你的意图)。所以它们没有编译时定义的值,显然不能用于数组初始化。您可能想要声明一个函数,如 void func(<whatever>);
,并在初始化中使用 func
。
你可以这样做,添加函数声明并使它们匹配函数指针类型,就像这样
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);
但是根据你的评论
The definitions of the functions are going to be pulled in at runtime from a shared library using dlsym – agranum 59 secs ago
你真正需要的是这个
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");
函数 poitner SUPP_MESSAGES[0].write_func
然后将使用您的 struct
定义和函数指针 typedef
指定的签名调用,请记住 void *
可转换为无需转换的任何类型的指针,所以这就是您所需要的。
我正在尝试初始化结构数组。该结构包含一个函数指针作为其数据成员之一。但是我的编译器给我一个错误,抱怨 The initializer element is not constant。如何使用声明的函数指针初始化数组?
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 }
};
generate_basic_msg_ptr
和 friends 只是甚至没有初始化的变量(好吧,严格来说它们可能已经被初始化为零,但这可能不是你的意图)。所以它们没有编译时定义的值,显然不能用于数组初始化。您可能想要声明一个函数,如 void func(<whatever>);
,并在初始化中使用 func
。
你可以这样做,添加函数声明并使它们匹配函数指针类型,就像这样
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);
但是根据你的评论
The definitions of the functions are going to be pulled in at runtime from a shared library using dlsym – agranum 59 secs ago
你真正需要的是这个
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");
函数 poitner SUPP_MESSAGES[0].write_func
然后将使用您的 struct
定义和函数指针 typedef
指定的签名调用,请记住 void *
可转换为无需转换的任何类型的指针,所以这就是您所需要的。