我试图在不使用typedef
的情况下真正理解函数指针,但似乎无法理解。我不知道传达一个指向函数的指针需要传递什么签名。
#include <stdio.h>
void odd() { printf("odd!\n"); }
void even() { printf("even!\n"); }
void (*get_pfn(int i))()
{
return i % 2 == 0 ? &even : &odd;
}
__SIGNATURE__
{
return &get_pfn;
}
int main()
{
get_pfn_pfn()(1)();
get_pfn_pfn()(2)();
return 0;
}
为了使此工作有效,
__SIGNATURE__
必须是什么? 最佳答案
它必须将函数指针返回到采用int
并返回函数指针的函数:
void (*(*get_pfn_pfn(void))(int))(void) {
return &get_pfn;
}
更多行:
void (*
(*
get_pfn_pfn(void) // this is our function
)(int i) // this is get_pfn(int)
)(void) // this is odd() or even()
{
return &get_pfn;
}
可以省略
void
,在这种情况下,函数指针指向带有未知数量参数的函数。这不是您想要的。要声明指向不带参数的函数的函数指针,应在函数参数列表内添加void
。最好以相同的方式将get_pfn
更改为void (*get_pfn(int i))(void)
。例如,尝试从get_pfn(1)("some arg", "some other arg");
调用。 C编译器不会发出警告,因为空()
表示未知参数。要说该函数不带参数,您必须(void)
。对于许多括号序列,尤其是
))(
,函数指针很难解析。这就是为什么许多人倾向于使用typedef作为函数指针或类型的原因:typedef void get_pfn_func_t(void);
get_pfn_func_t *get_pfn(int i) {
return i % 2 == 0 ? &even : &odd;
}
typedef get_pfn_func_t *get_pfn_pfn_func_t(int i);
get_pfn_pfn_func_t *get_pfn_pfn(void) {
return &get_pfn;
}