You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C语言中能否定义存储函数列表的变量?无需专用结构体

可以实现,无需专用结构体

完全不用定义专用结构体,直接用函数指针数组就能实现你要的功能,具体写法如下:

方法1:先定义函数指针类型(更清晰)

先给函数指针起个别名,方便后续复用:

// 定义无参数无返回值的函数指针类型
typedef void (*FuncPtr)(void);

// 示例函数
void func1(void) {
    printf("func1 called\n");
}

void func2(void) {
    printf("func2 called\n");
}

// 定义存储函数列表的数组,最后用NULL做终止标记
FuncPtr vf[] = {func1, func2, NULL};

方法2:直接定义函数指针数组(无需typedef)

如果不想额外定义类型,也可以直接写出数组的完整类型:

void func1(void) {
    printf("func1 called\n");
}

void func2(void) {
    printf("func2 called\n");
}

// 直接定义函数指针数组
void (*vf[])(void) = {func1, func2, NULL};

遍历调用函数列表的示例

你可以通过遍历数组来依次调用每个函数:

#include <stdio.h>

int main() {
    // 用方法2的数组为例
    void (*vf[])(void) = {func1, func2, NULL};
    
    // 遍历数组,直到遇到NULL终止
    for (int i = 0; vf[i] != NULL; i++) {
        vf[i](); // 调用函数
    }
    return 0;
}

关键说明

  • 函数名本身可以隐式转换为对应的函数指针,所以数组里直接写func1、func2就行,不用额外取地址。
  • 用NULL作为数组的终止标记,这样遍历的时候能知道什么时候停止(如果是固定长度的数组也可以不用,但用NULL更灵活)。
  • 因为你不受特定C标准限制,编译器通常会兼容这种写法,哪怕某些严格标准里对函数指针和void*的转换有要求,直接用NULL作为终止符也能正常工作。

内容的提问来源于stack exchange,提问作者dsal3389

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:30:57