2

構造体の配列を初期化しようとしています。構造体には、データ メンバーの 1 つとして関数ポインターが含まれています。しかし、私のコンパイラは、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 }
};
4

2 に答える 2

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");

関数 poitnerSUPP_MESSAGES[0].write_funcは、定義によって指定されたシグネチャstructと関数ポインタで呼び出され、キャストせずに任意のタイプのポインタに変換できることをtypedef覚えておいてください。必要なのはこれだけです。void *

于 2015-02-20T19:34:33.313 に答える
0

generate_basic_msg_ptr友達は初期化さえされていない単なる変数です(厳密に言えば、ゼロに初期化されている可能性がありますが、それはおそらくあなたの意図ではありません)。したがって、それらにはコンパイル時に定義された値がなく、明らかに配列の初期化には使用できません。のような関数を宣言し、初期化void func(<whatever>);で使用することができfuncます。

于 2015-02-20T19:32:20.980 に答える