我基本上希望将函数列表作为函数指针数组;然后,我希望管理此数组中的索引变量和接受此数组中的值的指针变量.考虑以下说明这一点的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;
}
如上面的代码所示,在代码中,我可以通过index变量(my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
)设置POINTER变量.
但是,我也想做一些类似的事情,也是为了初始化--最终,我只想先手动初始化数组值和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
...正如 comments 中的错误消息所暗示的那样,这些都不起作用.
我有点理解为什么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
的第一个条目?!
那么--有没有什么语法可以用来进行初始化,它允许我将指向数组中一个条目的给定初始值的指针变量initialize(类似于在正常代码中工作的赋值my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
)?