两种函数指针的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"是否可行?
这里得分两种场景理解:
- 如果是指在函数指针声明里只写
name作为参数(无类型):那前面已经说过,这在现代C里不合法,连声明都通不过,更别说后续的函数调用了。 - 如果是指实际调用函数时,把字符串字面量
"name"作为参数传进去:这要看函数指针指向的函数的参数类型。比如如果函数参数是const char*,那传"name"完全没问题;但如果参数是uint8这类数值类型,传字符串字面量会导致类型不匹配,编译器直接报错,肯定不可行。
内容的提问来源于stack exchange,提问作者R.chris
相关产品推荐
相关产品推荐

