C语言中函数的typedef是否为标准语法?与函数指针typedef有何区别?
关于C语言中无
*的函数typedef的疑问解答 1. 这种typedef属于标准C语法吗?
完全属于。C标准不仅允许typedef函数指针类型,也支持直接给函数类型定义别名。你看到的typedef void __stdcall RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN(RPC_INTERFACE_GROUP IfGroup, void* IdleCallbackContext, unsigned long IsGroupIdle);就是标准用法:它定义了一个函数类型——遵循__stdcall调用约定,返回void,参数是指定的三个类型。
对比常见的函数指针typedef(比如typedef int (*PFN_RETURNING_INT)(int, int);),前者是给函数本身的类型起别名,后者是给指向函数的指针类型起别名,二者是不同的类型,但关联紧密。
2. 该typedef应视为函数类型还是函数指针类型?
它定义的是函数类型,不是函数指针类型。你可以用一段代码验证:
// 定义一个函数类型别名 typedef void FuncType(int); // 写一个匹配该类型的函数 void testFunc(int a) { /* 实现 */ } // 尝试直接声明函数类型的变量:编译报错,因为C里不能直接定义函数类型的变量 // FuncType funcVar; // 错误:无法声明函数类型的变量 // 但可以声明指向该函数类型的指针 FuncType* funcPtr = testFunc; // 合法,testFunc会自动转为函数指针
从编译报错就能明确,FuncType本身是函数类型,必须加*才能声明指向该类型函数的指针变量。
3. 函数参数中函数类型隐式转指针的行为是有意设计吗?
这是C标准特意设计的特性,和数组作为函数参数时会隐式转指针的规则是同一个逻辑。
C标准规定:当函数类型被用作函数参数的类型时,会自动调整为指向该函数类型的指针类型。也就是说,下面两个函数声明完全等价:
// 写法1:用函数类型作参数 void registerCallback(RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN callback); // 写法2:显式用函数指针作参数 void registerCallback(RPC_INTERFACE_GROUP_IDLE_CALLBACK_FN* callback);
这种设计是为了简化代码:你可以直接传入函数名(函数名在表达式里除了少数场景都会自动转成指针),不用手动加&取地址;同时也兼容直接传函数指针变量的写法,非常灵活。
内容的提问来源于stack exchange,提问作者John Källén
相关产品推荐
相关产品推荐

