在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
相关产品推荐
相关产品推荐

