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

两种函数指针的typedef是否合法?代码解析及参数使用疑问

typedef uint8 (*Funcptr) (name);
typedef uint8 (*Funcptr1) (name);
typedef struct {
    Funcptr func;
    Funcptr1 func_1;
} a;
代码具体含义拆解

咱们一步步拆这段代码的逻辑:

  • 第一行typedef uint8 (*Funcptr) (name);:这是给一种函数指针类型起了别名Funcptr。这种指针指向的函数要满足两个条件:返回值是uint8(应该是你自定义的无符号8位整数类型,通常由typedef unsigned char uint8;定义),并且接收一个名叫name的参数——不过这里没写参数类型,这是关键问题。
  • 第二行typedef uint8 (*Funcptr1) (name);:和第一行完全等价,只是别名换成了Funcptr1,本质上Funcptr和Funcptr1是完全相同的函数指针类型,重复定义有点多余。
  • 后面的结构体定义:给一个匿名结构体起了别名a,这个结构体包含两个成员,都是上面定义的函数指针类型,分别叫func和func_1。
这种typedef定义是否合法?

答案是:在现代C标准(C99及之后)里不合法,问题出在参数列表里的name上。

  • 早年的C(比如C89之前)允许只写参数名不写类型的旧式声明,但现代C已经彻底废弃了这种写法。编译器要么会抛出警告,要么直接报错——因为它无法确定name这个参数的类型,没法正确处理函数指针的类型匹配逻辑。
  • 正确的写法必须明确参数类型,比如如果name是字符串类型,就写成typedef uint8 (*Funcptr) (const char* name);;如果函数不需要参数,就写typedef uint8 (*Funcptr) (void);。
函数调用参数中使用"name"是否可行?

这里得分两种场景理解:

  1. 如果是指在函数指针声明里只写name作为参数(无类型):那前面已经说过,这在现代C里不合法,连声明都通不过,更别说后续的函数调用了。
  2. 如果是指实际调用函数时,把字符串字面量"name"作为参数传进去:这要看函数指针指向的函数的参数类型。比如如果函数参数是const char*,那传"name"完全没问题;但如果参数是uint8这类数值类型,传字符串字面量会导致类型不匹配,编译器直接报错,肯定不可行。

内容的提问来源于stack exchange,提问作者R.chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:09:07