我基本上希望将函数列表作为函数指针数组;然后,我希望管理此数组中的索引变量和接受此数组中的值的指针变量.考虑以下说明这一点的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];)?

推荐答案

您声明的函数指针是错误的.函数指针不是void*,但需要有适当的签名:

typedef void(*func_ptr)(void);

然后您可以这样使用它:

const func_ptr funcs_ptrs[_NUM_FUNC_CHOICE] = {
    &func_01,
    &func_02,
    &func_03,
};

func_choice_t my_func_choice_idx = eFUNC01;
func_ptr my_func_choice_ptr = funcs_ptrs[eFUNC01];

如果你想用my_func_choice_idx来初始化它,你不能全局地做,因为它不是一个常量,但你可以用main来做:

int main(void) {
    func_ptr my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
}

C++相关问答推荐

C限制限定符是否可以通过指针传递?

通过MQTT/蚊子发送大文件—限制在4MB

在32位处理器上优化53—32位模计算>

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

有没有更简单的方法从用户那里获取数据类型来计算结果

从组播组地址了解收到的数据包长度

如何跨平台处理UTF-16字符串?

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

类型定义 struct 与简单的类型定义 struct

从BIOS(8086)中读取刻度需要多少?

如何在zOS上编译共享C库

如何在C宏定义中包含双引号?

即使我在C++中空闲,也肯定会丢失内存

Struct 内的数组赋值

free后内存泄漏?

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组

将十六进制值或十进制值分配给 uint16_t 有什么区别?

计算 e^x 很好.但不是 x 的罪