[英]Can't initialize array with struct containing function pointer -error: 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 }
};
您可以這樣做,添加函數聲明,並使它們與函數指針類型匹配,如下所示
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從共享庫中提取–大約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");
然后將使用struct
定義和函數指針typedef
指定的簽名調用poitner SUPP_MESSAGES[0].write_func
函數,並記住void *
可以轉換為任何類型的指針而無需轉換,因此這就是您所需要的。
generate_basic_msg_ptr
和朋友只是沒有初始化的變量(嚴格來說,它們可能已經初始化為零,但這可能不是您的意圖)。 因此它們沒有編譯時定義的值,並且顯然不能用於數組初始化。 您可能想要聲明一個函數,例如void func(<whatever>);
,並在初始化中使用func
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.