我发现自己不小心在不同的地方使用了两种不同风格的C函数指针定义,并决定编写一个最小程序来测试这些差异。
所涉及的两种风格是:
int (comp (int))
并且
int (*comp)(int)
我写了一个简单的程序,使用了这两种风格的同一个函数指针,一种用于函数的声明,另一种用于相同函数的定义,以查看编译器对此的反应。 声明:
int a_or_b (int (*a_fn)(), int (b_fn()), int (*comp)(int));
定义:
int a_or_b (int (a_fn()), int (*b_fn)(), int (comp(int)))
{
int out = a_fn ();
if (comp (out))
out = b_fn ();
return out;
}
正如您(希望)所见,在声明的第一个参数中,我使用了样式int (*a_fn)()
,而在函数定义中,我使用了样式int (a_fn ())
。我对接下来的两个参数也做了类似的处理。
我猜想这些可能是不兼容的类型,这些样式可能是变量按引用传递和按值传递分配之间的区别,但当我编译此程序时,编译器默默地并且高兴地将其编译通过。没有错误,没有警告,什么都没有。
由于我看过很多教程推荐使用第二种样式,而我个人更喜欢第一种样式出于美学目的,因此我很想知道这两种样式之间的区别以及哪种样式被推荐。
完整代码示例:
#include <stdio.h>
int a ();
int b ();
int a_or_b (int (*a_fn)(), int (b_fn()), int (*comp)(int));
int a ()
{
return 1;
}
int b ()
{
return 2;
}
int comparison (int param)
{
return param;
}
int a_or_b (int (a_fn()), int (*b_fn)(), int (comp(int)))
{
int out = a_fn ();
if (comp (out))
out = b_fn ();
return out;
}
int main (int argc, char **argv)
{
printf ("%i\n", a_or_b (a, b, comparison));
return 0;
}