C/C++函数定义及函数调用

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)所以对于函数调用而言

一是一般情况下必须有: 函数名+()+;

二是函数针对的调用,必须有: [(]*函数名[)]();

相关推荐
好好学习啊天天向上6 个月前
llvm polly,亲自测试
自动性能优化
好好学习啊天天向上6 个月前
世上最全:ubuntu 上及天河超算上源码编译llvm遇到的坑,cmake,ninja完整过程
linux·运维·ubuntu·自动性能优化
好好学习啊天天向上7 个月前
多面体基准测试集PolyBench
自动性能优化