我试图在不使用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;
}

09-10 00:36
查看更多