我基本上想要一个函数列表作为函数指针数组;然后我想管理该数组中的索引变量和接受该数组中的值的指针变量。考虑下面的 C 代码来说明这一点,它可以正常编译:
#include <stdio.h>
void func_01() {
printf("func_01\n");
}
void func_02() {
printf("func_02\n");
}
void func_03() {
printf("func_02\n");
}
enum func_choice_e {
eFUNC01 = 0,
eFUNC02 = 1,
eFUNC03 = 2,
#define _NUM_FUNC_CHOICE 3
NUM_FUNC_CHOICE = _NUM_FUNC_CHOICE,
};
typedef enum func_choice_e func_choice_t;
void* funcs_ptrs[_NUM_FUNC_CHOICE] = {
&func_01,
&func_02,
&func_03,
};
func_choice_t my_func_choice_idx = eFUNC01;
void* my_func_choice_ptr = &func_01;
int main()
{
my_func_choice_idx = eFUNC02;
my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
printf("Hello World %p\n", my_func_choice_ptr);
return 0;
}
如上面的代码所示,在代码中我可以通过索引变量 ( ) 设置指针变量my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
。
但是,我想做类似的事情,也用于初始化 - 最终,我只想初始化数组值并my_func_choice_idx
首先手动 - 然后将指针自动初始化为数组中相应的元素my_func_choice_idx
;所以代替工作指针初始值设定项:
void* my_func_choice_ptr = &func_01;
...我已经尝试过这些:
//void* my_func_choice_ptr = funcs_ptrs[my_func_choice_idx]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[eFUNC01]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[0]; // error: initializer element is not constant
...正如评论中的错误消息所暗示的那样,这些都不起作用。
我有点明白为什么funcs_ptrs[my_func_choice_idx]
可能会失败 -my_func_choice_idx
毕竟是一个变量 - 但当编译器到达时,它应该已经“知道” ->my_func_choice_ptr = funcs_ptrs[0];
的地址、大小和初始值,所以我不明白为什么会这样funcs_ptrs
无法设置my_func_choice_ptr
为第一个条目funcs_ptrs
?!
那么 - 是否有一些语法可以用于初始化,这将允许我将指针变量初始化为数组中条目的给定初始值(类似于my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
在正常代码中工作的赋值)?
您声明函数指针错误。函数指针不是
void*
,但需要有正确的签名:然后你可以像这样使用它:
如果您想使用 初始化它
my_func_choice_idx
,则不能全局执行此操作,因为它不是常量,但您可以在以下位置执行此操作main
: