C语言中void类型typedef工作原理及特定函数指针typedef解析
拆解你的typedef和相关用法
1. 先搞懂typedef void (*p_t)(char* a1, char* a2, int a3);的含义
其实这个typedef就是给一种函数指针类型起了个简洁的别名p_t。我们可以先把typedef去掉,看剩下的代码:
void (*p_t)(char* a1, char* a2, int a3);
这时候p_t是个变量,它的类型是:指向返回值为void、参数依次是char*、char*、int的函数的指针。加上typedef之后,p_t就不再是变量,而是这个复杂指针类型的专属别名了。
简单说,任何符合以下签名的函数:
void some_function(char* arg1, char* arg2, int arg3);
它的地址都能直接赋值给p_t类型的变量。
2. main函数里的用法解释
看你给出的代码片段:
int main(void) { p_t p = &some_function; p("foo", "bar", 42); }
p_t p = &some_function;:这里是把some_function的函数地址赋值给变量p,因为p的类型p_t刚好匹配some_function的签名。其实这里的&可以直接省略,因为函数名本身就代表它的内存地址,写成p_t p = some_function;也是完全合法的。p("foo", "bar", 42);:这是通过函数指针p调用对应的函数,效果和直接写some_function("foo", "bar", 42);完全一致。C语言允许用函数指针直接加括号传参调用,和调用普通函数的写法几乎没区别。
3. C语言中void类型的typedef是如何工作的
首先要明确:你例子里的void是函数的返回值类型,不是typedef的核心对象——我们typedef的是带有void返回值的函数指针类型,而非void本身(当然你也可以直接给void起别名,比如typedef void void_t;,但这个写法几乎没有实际用处)。
关于void在typedef里的两种常见情况:
- 如果是
typedef void my_void;:这只是给void类型起了个新名字my_void,你可以用它声明返回值为void的函数,比如my_void func();,和void func();完全等价。 - 回到你的场景,
void是函数指针指向的函数的返回值,typedef的作用就是把“返回void、参数为char*,char*,int的函数指针”这个冗长的类型,简化成p_t,方便你在代码中多次声明这种类型的指针变量,不用每次都写一长串复杂的类型定义。
另外提个小技巧:函数指针的typedef语法确实有点绕,你可以把typedef后的别名当成变量名,剩下的部分就是这个变量的类型,加了typedef之后,别名就变成这个类型的专属名称了。
内容的提问来源于stack exchange,提问作者sophist_pt
相关产品推荐
相关产品推荐

