哪些声明适用于声明C函数?

Kor*_*gay 1 c

我试图理解信号并从各种资源中学习.

我找到的一个资源就是这个.

这里的声明如下:

void (*signal(int, void (*)(int)))(int);
Run Code Online (Sandbox Code Playgroud)

而另一个就是这个.

这里的声明如下:

void (*signal(int sig, void (*func) (int)))(int);
Run Code Online (Sandbox Code Playgroud)

所以并排(!)他们是:

void (*signal(int, void (*)(int)))(int);
void (*signal(int sig, void (*func) (int)))(int);
Run Code Online (Sandbox Code Playgroud)

哪一个是正确的方式,为什么?

Ker*_* SB 5

在函数类型中,参数可以但不需要具有名称.您无法对名称进行任何操作,它们充当了文档:

typedef bool(*checker_v1)(int);
typedef bool(*checker_v2)(int arg);    // optional parameter name

checker_v1 f = is_even;
checker_v2 g = is_odd;
f = g;                    // f and g have the same type

typedef bool(fchecker)(int);   // also OK, fchecker* == checker_v1 == checker_v2
Run Code Online (Sandbox Code Playgroud)

函数指针可以是函数参数的类型:

void process(int n, checker_v1 f, fchecker* g, bool(*h)(int pointless))
{
    if (f(n)) { do_a(); }
    if (g(n)) { do_b(); }
    if (h(n)) { do_c(); }
}
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中,请注意第四个参数类型的类型参数的process名称完全不相关.