我正在尝试了解信号并从各种资源中学习。
我找到的一个资源是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);
哪一个是正确的方法,为什么?
答案 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.