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

时间:2015-06-03 20:23:28

标签: c

我正在尝试了解信号并从各种资源中学习。

我找到的一个资源是this

声明如下:

void (*signal(int, void (*)(int)))(int);

另一个是this

声明如下:

void (*signal(int sig, void (*func) (int)))(int);

所以并排(!)他们是:

void (*signal(int, void (*)(int)))(int);
void (*signal(int sig, void (*func) (int)))(int);

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

3 个答案:

答案 0 :(得分: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

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

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(); }
}

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

答案 1 :(得分:3)

两者都是一样的。

一个声明恰好给他们起名以帮助理解。另一个则不太有帮助。

名字的人试图自我记录

答案 2 :(得分:3)

void foo(int);

相同
void foo(int x);
          // ^^ name of the argument.

同样,

void (*signal(int, void (*)(int)))(int);

相同
void (*signal(int sig, void (*func) (int)))(int);
                           // ^^^^ name of the argument.