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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:24:55