1)函数定义,前面必须有数据类型,且直接接括号对,括号对后面是{}
如
void main()
{
}
int Rosenbrock(KPP_REAL Y[], KPP_REAL Tstart, KPP_REAL Tend,
KPP_REAL AbsTol[], KPP_REAL RelTol[],
void (*ode_Fun)(KPP_REAL, KPP_REAL [], KPP_REAL []),
void (*ode_Jac)(KPP_REAL, KPP_REAL [], KPP_REAL []),
KPP_REAL RPAR[], int IPAR[])
{}
上面的
void (*ode_Fun)(KPP_REAL, KPP_REAL [], KPP_REAL []),
是函数的参数,函数指针。后面接的是, )等,不是{
其实处理起来也挺繁琐的
3)而对于函数声明
cpp
/*~~~> Function headers */
void FunTemplate(KPP_REAL, KPP_REAL [], KPP_REAL []);
void JacTemplate(KPP_REAL, KPP_REAL [], KPP_REAL []) ;
后面接的是;不是{
所以也不是函数定义。
4)对于函数调用
4.1)前面不能带类型,如void (*ode_Fun)(KPP_REAL, KPP_REAL [], KPP_REAL []),
前面带了类型,后面不是;
肯定不是函数调用
5)函数调用有个函数名,后面
cpp
/*~~~> Compute the function at current time */
(*ode_Fun)(T,Y,Fcn0);
/*~~~> Compute the function derivative with respect to T */
if (!Autonomous)
ros_FunTimeDerivative ( T, Roundoff, Y, Fcn0, ode_Fun, dFdT );
/*~~~> Compute the Jacobian at current time */
(*ode_Jac)(T,Y,Jac0);
这个代码,一是经典的函数指针产生的函数调用。
在 C 语言中,(*ode_Fun) 的写法是函数指针的典型特征:
ode_Fun存储的是某个函数的内存地址(这是函数指针的本质,指向函数的入口地址);- 括号
(*ode_Fun)是必需的(优先级原因),用于明确表示*是作用于ode_Fun(而非作用于函数返回值),表明ode_Fun是一个指针类型。 (*ode_Fun):解引用函数指针,获取它所指向的函数实体;(T,Y,Fcn0):函数调用操作符,里面是传递给目标函数的三个参数;- 末尾的
;:表示这是一条可执行语句,而非定义
二是最典型的函数调用。
5)所以对于函数调用而言
一是一般情况下必须有: 函数名+()+;
二是函数针对的调用,必须有: [(]*函数名[)]();