我有一個結構數組。該結構有兩個函數指針。數組中的每個元素都需要函數指針來指向不同的函數,以便可以在不知道具體函數名稱的情況下調用與特定元素對應的函數。作爲函數指針的新手,在我看來,我正在做的事情不會奏效,但我不知道如何正確執行。如何調用被指向的函數的一個例子也是值得讚賞的。使用通用函數指針
下面是我想引用函數的原型:
int edit_translate_concise(struct ged *gedp, const union edit_cmd * const cmd);
int edit_translate_add_arg(union edit_cmd * const cmd, struct edit_arg * const arg);
的結構和結構的排列如下:
struct edit_cmd_tab {
char *name;
char *opt_global;
char *usage;
char *help;
int (*exec_concise)(struct ged *gedp, const union edit_cmd *const cmd);
int (*add_arg)(union edit_cmd *const cmd, struct edit_arg *const arg);
};
static const struct edit_cmd_tab edit_cmds[] = {
...
{"translate", (char *)NULL,
"[FROM] TO OBJECT ...",
"[[-n] -k {FROM_OBJECT | FROM_POS}]\n"
"[-n] [-a | -r] {TO_OBJECT | TO_POS} OBJECT ...",
&edit_translate_concise,
&edit_translate_add_arg
},
...
};
因此,功能我需要指向採用相同的參數並返回與結構的函數指針成員相同的類型。
我得到這些警告,指的是第一個結構的最後兩行:
/home/bhinesley/brlcad-trunk/src/libged/edit.c:866:55: warning: ‘union edit_cmd’ declared inside parameter list [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:866:55: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:867:54: warning: ‘union edit_cmd’ declared inside parameter list [enabled by default]
而且這些警告指的是最後兩行排列的:
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1188:2: warning: initialization from incompatible pointer type [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1188:2: warning: (near initialization for ‘edit_cmds[1].exec_concise’) [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1190:5: warning: initialization from incompatible pointer type [enabled by default]
/home/bhinesley/brlcad-trunk/src/libged/edit.c:1190:5: warning: (near initialization for ‘edit_cmds[1].add_arg’) [enabled by default]
你(最終)在代碼中的某個地方定義了「union edit_cmd」類型嗎? –
是的,它只是需要在edit_cmd_tab結構之前移動。 – bhinesley
值得一提的是,這些'const'中的一些並不真正有用。它不應該導致錯誤,但它可能意味着你應該看看'cdecl'(http://cdecl.ridiculousfish.com/)以確保'const'是你想要的位置。 (尤其值得關注的是'union edit_cmd * const'作爲函數參數。) –