簡體   English   中英

無法使用包含函數指針-error的結構初始化數組:initializer元素不是常量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM