C++函数指针

我们来分析一个函数指针的案例1

首先area.h文件中进行定义

typedef void (*fDataManage)(int iAreaSign);    //fDataManage等价于类型 int (*)(int),int (*)(int)是类型名,fDataManage是别名
typedef struct kpMac_Area_Unit
	{
		int iAddrOffset;
		unsigned char btVal;
		unsigned char btMask;
	}Mac_Area_Unit;
typedef struct kpMAC_AREA
	{
		Mac_Area_Unit stMacAreaUnit[MAC_AREA_COUNT];
		fDataManage pDataManage;
	}MAC_AREA;

void SetDataManage(fDataManage p);

然后在area.c文件中需要进行变量初始化操作(将pDataManage 设置为NULL),并且对进行SetDataManage进行函数实现,设置要函数指针的具体值。

MAC_AREA g_stMacArea;

void InitMacArea()
{
	....
	for (i=0;i

然后可以在其他任意地方如(InitAxis.c)对函数进行调用(需要引入对应的头文件),并将AxisDataManage函数地址作为入参。

void InitAxis()
{
	SetDataManage(AxisDataManage);
}

void AxisDataManage(int iLoc)
{
	int i;
	for (i=0;i

以上的都是对函数指针进行了设置与定义,没有真正执行函数指针所指定的函数,接下来需要执行函数指针的函数如下:

在area.c文件中对指针函数进行调用实现:

void TransferPulse()
{
	...
	for ( i = 0; i < MAC_AREA_COUNT; i++)
	{
        ...
        g_stMacArea.pDataManage(i);
		...
	}
}

案例2——一个结构体内定义多个函数指针

在Load.h文件中定义:

    typedef void (*fSpecialAxisMoveSet)(DIGIT_CMD* pMacUser);
	typedef void (*fSpecialOpParaSet)(int iLabel);
	typedef int (*fAnalyseCmdData)(int iIndex,DIGIT_CMD* pMacUser);

	typedef struct kpMAC_LOAD_MOVE_PARA
	{
		int iLoadIndex;
		DIGIT_CMD stMacUser;
		fAnalyseCmdData pAnalyseCmdData;
		fSpecialAxisMoveSet pSpecialAxisMoveSet;
		fSpecialOpParaSet pSpecialOpParaSet;
	}MAC_LOAD_MOVE_PARA;

void InitMacLoadMovePara(fAnalyseCmdData pData,fSpecialAxisMoveSet pPara);	

void SetOpPara(fSpecialOpParaSet p);

在Load.c文件中进行一个初始化操作

void InitMacLoadMovePara(fAnalyseCmdData pData,fSpecialAxisMoveSet pPara)
{	
	memset(&g_stMacLoad,0,sizeof(MAC_LOAD_MOVE_PARA));
	g_stMacLoad.pAnalyseCmdData = pData;
	g_stMacLoad.pSpecialAxisMoveSet = pPara;
}

在move.c文件初始化的使用执行了:

void InitMove()
{
    ...
    InitMacLoadMovePara(AnalyseCmdData,SpecialAxisMoveSet);
    ...
}
int AnalyseCmdData(int iIndex,DIGIT_CMD* pMacUser)
{
    ...
}
void SpecialAxisMoveSet(DIGIT_CMD* pMacUser)
{
    ...
}

最后在Load.c文件中执行了指针函数

void LoadUnionMovePara()
{
    g_stMacLoad.pAnalyseCmdData(int,&g_stMacLoad.stMacUser);
    g_stMacLoad.pSpecialAxisMoveSet(&g_stMacLoad.stMacUser);
}

其实都一样,只是不同函数间的相互调用罢了。

参考:

C语言指针进阶(一)——深入详解“函数指针”与“指针函数”-CSDN博客

你可能感兴趣的:(c++,开发语言)