如何定义与main函数原型一致的自定义函数指针数组?typedef指向main函数的函数指针的正确实现
如何定义与main原型一致的函数指针数组及正确的typedef写法
咱们先把你的问题拆成两部分来解决:先搞定指向main类型的函数指针的typedef,再看函数指针数组的定义,顺便解决你纠结的数组大小问题~
一、先纠正你的typedef写法
你写的typedef mainPtr(*f[])(int, char**);是不对的,原因有两个:
- typedef的语法是「
typedef 原类型 别名;」,你把别名和原类型的顺序搞反了; - 这里错误地把数组的写法混进了typedef里,你本来是想定义函数指针的别名,结果写成了数组类型的别名(而且写法还不对)。
main函数的标准原型是int main(int argc, char** argv),对应的函数指针类型是int (*)(int, char**)——拆解一下:这是一个指针,指向的函数接受int和char**参数,返回int。
所以正确的typedef应该是:
typedef int (*mainPtr)(int, char**);
这里mainPtr就是我们定义的别名,代表「指向和main同原型的函数的指针」类型。
二、定义与main原型一致的函数指针数组
有两种方式可以定义,取决于你是否用上面的typedef:
方式1:直接定义(不用typedef)
直接写出函数指针数组的类型,语法是:返回值类型 (*数组名[数组大小])(参数列表)
// 示例:初始化时传入元素,数组大小自动推导 int (*func_array[])(int, char**) = {&main, &my_main_func}; // 如果只声明不初始化,必须显式指定大小 int (*func_array[5])(int, char**); // 可以存放5个该类型的函数指针
方式2:用typedef简化(更清晰)
有了上面的mainPtr别名,数组定义就简洁多了:
// 初始化时自动推导大小 mainPtr func_array[] = {&main, &my_main_func}; // 显式指定大小的声明 mainPtr func_array[3]; // 可存放3个符合要求的函数指针
三、关于你纠结的「数组未定义大小」问题
在C语言里:
- 如果数组初始化时提供了元素列表,编译器会自动根据元素个数推导数组的大小,不需要你显式写出来;
- 如果只是声明数组但不初始化,那必须显式指定大小,否则编译器不知道要分配多少内存。
完整示例代码
#include <stdio.h> // typedef出指向main类型的函数指针 typedef int (*mainPtr)(int, char**); // 定义一个和main原型一致的测试函数 int my_custom_main(int argc, char** argv) { printf("Called my_custom_main with argc = %d\n", argc); return 0; } int main(int argc, char** argv) { // 方式1:直接定义函数指针数组 int (*direct_arr[])(int, char**) = {&main, &my_custom_main}; // 调用数组中的第一个函数 direct_arr[0](argc, argv); // 方式2:用typedef的别名定义数组 mainPtr typedef_arr[] = {&my_custom_main, &main}; // 调用数组中的第二个函数 typedef_arr[1](argc, argv); return 0; }
补充一句:虽然标准C里对main函数的地址获取没有明确禁止,大多数编译器都是支持取&main的,所以上面的代码是可以正常编译运行的。
内容的提问来源于stack exchange,提问作者qu4lizz
相关产品推荐
相关产品推荐

