【发布时间】:2013-04-06 18:05:44
【问题描述】:
例如,我有一个名为 int compute (int x1, int x2, int (* op) (int, int) ) 的函数,它以函数指针为参数到一个做一些算术运算的函数
int add (int a1, int a2)
{
return (a1 + a2);
}
int mul (int s1, int s2)
{
return (s1 * s2);
}
int compute (int x1, int x2, int (* op) (int, int) )
{
return ( op (x1, x2) );
}
main()
{
int result;
int op1, op2;
op1 = 4;
op2 = 5;
result = compute (op1, op2, &add());
result = compute (op1, op2, &mul());
}
除了所有这些函数指针的东西,我也可以使用标志作为参数而不是函数指针来实现相同的目的。
int compute (int x1, int x2, int opFlag)
{
if ( opFlag == 1 )
return ( add (x1, x2); );
if ( opFlag == 2)
return ( mul (x1, x2); );
return 1;
}
main()
{
int result;
int op1, int op2;
op1 = 4;
op2 = 5;
result = compute (op1, op2, 1);
result = compute (op1, op2, 2);
}
现在的问题是,“函数指针”方法与“简单标志方法”在效率、代码方面的(广告/不利)优势是什么?尺寸、便携性、可读性等,?
【问题讨论】:
-
如果您使用标志并且想要添加更多功能,则必须编辑代码以添加更多
if子句。 -
有了函数指针,可以在不改变或重新编译
compute的情况下传递其他算法。 -
您可以通过函数指针获得可重用性。
Compute( )可以放在库中并分发给其他用户,无需更新即可支持新操作。 -
您是在一般情况下还是在这种特殊情况下询问?一般来说,您将如何使用标志实现
qsort或bsearch之类的东西? -
result = compute (op1, op2, &add());行包含错误,不应编译(gcc 表示erreur: lvalue required as unary ‘&’ operand。该行应为result = compute (op1, op2, add);,根据需要获取add()的地址..
标签: c callback function-pointers