C语言中函数指针定义正确性及func_obj类型与用途咨询
C语言函数类型与函数指针相关问题解答
问题1:这种函数指针定义方式是否正确?
这是完全正确的函数指针定义方式。
解释:
typedef void (func_type)(void);是把func_type定义为**“无参数、无返回值的函数类型”**,而非函数指针类型。- 后续的
func_type *func_ptr;等价于直接写void (*func_ptr)(void);,也就是定义了一个指向该类型函数的指针变量func_ptr。
这种写法的优势在于,当需要多次定义同类型的函数指针时,用typedef可以简化重复的复杂声明,让代码更简洁易读。
问题2:func_obj的类型是什么?可用于哪些场景?
类型说明
func_type func_obj; 中的func_obj是**“无参数、无返回值的函数类型”**的声明——注意这只是函数声明,并没有提供函数实现,如果后续未定义func_obj函数,链接阶段会报错。
sizeof输出的解释
C语言标准明确规定sizeof运算符不能直接作用于函数,但部分编译器(如GCC)会做兼容处理,返回1作为占位的“伪大小”;而func_ptr是函数指针,其大小和普通指针一致(64位系统下为8字节,32位系统下为4字节),这就是输出差异的原因。
适用场景
- 统一函数原型声明:如果有多个同类型的函数(比如一批无参数无返回值的回调函数),用
func_type声明它们,能让代码风格更一致。 - 作为函数参数类型:定义接收函数作为参数的函数时,可以用
func_type作为参数类型(函数类型在参数列表中会隐式转换为函数指针类型,效果和直接用函数指针参数一致)。例如:void call_func(func_type f) { f(); // 等价于调用(*f)() } - 配合函数指针使用:函数名
func_obj可以隐式转换为对应的函数指针,直接赋值给func_ptr,比如func_ptr = func_obj;,之后就能通过指针调用函数。
内容的提问来源于stack exchange,提问作者mrn
相关产品推荐
相关产品推荐

