gpt4 book ai didi

c++ - Objective C 中的函数指针

转载 作者:太空狗 更新时间:2023-10-29 21:07:02 26 4
gpt4 key购买 nike

我在调试时遇到了以下代码。我能够正确地得到结果,但我不理解这里定义的函数指针。

这里的pNewMsgeFunc是在结构体stRsStruct中创建的函数指针tNewMsg的别名。

RsMsg.h

typedef RsMsg* (*tNewMsg)(void);
tNewMsg pNewMsgFunc;
typedef struct
{
int nMsgId;
NSString* sAsciiName;
tNewMsg pNewMsgFunc; // calls new for the particular message
} stRsStruct;

RsMsg.cpp

RsMsg(int uMessageId,tNewMsg pNewMsg,const char* szAsciiName,void* pData,
size_t uDataSize)
{
//intialisations
}

RsMsgDerived.h

#define DECLARE_NEWMSG(CssName,CssID)                   \
static CssName* FromMsg(RsMsg* pMsg) \
{ \
return dynamic_cast<CssName*>(pMsg); \
} \
static RsMsg* NewMsg() \
{ \
return new CssName; \
} \
enum {ID = CssID}; \

据说在结构体pNewMsgFunc中会指向NewMsg()函数。

但如果不使用

的地址初始化 tNewMsg,我无法理解它是如何实现的

NewMsg() 函数。但这段代码运行良好。没有其他构造函数用于

用函数 NewMsg() 的地址初始化函数指针。

事件.cpp

#import "RsMsg.h"
#import "RsMsgDerived.h"

RsMsg* RsMsg::CreateMessage(REMOTE_MESSAGE_ID nMessageNumber)
{
RsMsg* pMsg = NULL;
stRsStruct* pMsgStruct;

pMsg = pMsgStruct->pNewMsgFunc(); //Invoking the function pointer
}

在这里,通过调用函数指针,我调用了静态 NewMsg() 函数。

但是这个函数如何被调用为 pNewMsgFunc() 并没有分配给 NewMsg 的地址。

我需要通过pNewMsgFunc()调用NewMsg()函数。上面的代码有什么需要修改的吗?

编辑:

如何在Objective C中实现同样的代码,这个函数指针调用一个函数 其返回类型是一个类。所以尽管函数指针可以在 C 中实现为它调用返回类型为类的函数不能在 Objective C 中实现作为 c 函数。

最佳答案

Here pNewMsgeFunc is the alias name of the function pointer tNewMsg which is created inside the structure stRsStruct

不,不是。 tNewMsg 是一个标识类型的名称。

typedef RsMsg* (*tNewMsg)(void);

...但是 pNewMessageFunc 是该类型的对象。

这样看。在这段代码中:

typedef unsigned int uint;
uint n = 42;

n 不是 uint 的别名。相反,nuint 类型的变量。

因此,pNewMessageFunc 是一个全局变量(类型为 pointer-to-function-which-takes-no-parameters-and-returns-pointer-to-RsMsg ) 你永远不会初始化。

关于c++ - Objective C 中的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com