请问我这种写法怎么能调用到void类型的函数?

HeiYanXiaoHuai 2016-12-17 11:33:51
首先下面这个是可以正常调用int类型的:

int NewHookUserMsg(char *szMsgName, pfnUserMsgHook pfn)
{
printf("Success!");

return gEngfuncs.pfnHookUserMsg(szMsgName, pfn);
}

int Initialize(struct cl_enginefuncs_s *pEnginefuncs, int iVersion)
{
memcpy(&gEngfuncs, pEnginefuncs, sizeof(gEngfuncs));

//pfnHookUserMsg是int型
pEnginefuncs->pfnHookUserMsg = &NewHookUserMsg;

return gExportfuncs.Initialize(pEnginefuncs, iVersion);
}


但是如果是void类型的话就不知道要怎么写了:

void NewHookSoundIndex(int SoundID, float volume)
{
//实际上这个函数不能被pEnginefuncs->pfnPlaySoundByIndex = &NewHookSoundIndex;调用到
printf("??????");

return gEngfuncs.pfnPlaySoundByIndex(SoundID, volume);
}

int Initialize(struct cl_enginefuncs_s *pEnginefuncs, int iVersion)
{
memcpy(&gEngfuncs, pEnginefuncs, sizeof(gEngfuncs));

//pfnPlaySoundByIndex是typedef void型, 请问各位这里要怎么写才可以执行到void NewHookSoundIndex
pEnginefuncs->pfnPlaySoundByIndex = &NewHookSoundIndex;

return gExportfuncs.Initialize(pEnginefuncs, iVersion);
}

谢谢!
...全文
335 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-12-17
  • 打赏
  • 举报
回复
引用 4 楼 HeiYanXiaoHuai 的回复:
[quote=引用 3 楼 lunat 的回复:] 表达的不够清楚。 pEnginefuncs->pfnPlaySoundByIndex = &NewHookSoundIndex; 这只是一个赋值语句,把函数地址复制给一个变量,不是调用这个函数。 按照你的代码来看,函数指针是存储在pEnginefuncs里面的,调用发生在Initialize函数之后。以你贴出来的代码,无法判断,为什么这些函数没被调用。
嗯....简单地来讲就是一个void型函数的地址怎么赋值给变量[/quote] 1、你的pfnPlaySoundByIndex不是void类型,而是函数指针类型,只不过这个函数返回的是void,这是两个完全不同的概念 2、你要赋值给int变量,直接强制类型转换就可以了
HeiYanXiaoHuai 2016-12-17
  • 打赏
  • 举报
回复
引用 5 楼 lunat 的回复:
void不是函数的类型,是函数的返回类型。你现在写的代码就可以达到你的目的。
谢谢!我搞懂了!!
lunat 2016-12-17
  • 打赏
  • 举报
回复
void不是函数的类型,是函数的返回类型。你现在写的代码就可以达到你的目的。
HeiYanXiaoHuai 2016-12-17
  • 打赏
  • 举报
回复
引用 3 楼 lunat 的回复:
表达的不够清楚。 pEnginefuncs->pfnPlaySoundByIndex = &NewHookSoundIndex; 这只是一个赋值语句,把函数地址复制给一个变量,不是调用这个函数。 按照你的代码来看,函数指针是存储在pEnginefuncs里面的,调用发生在Initialize函数之后。以你贴出来的代码,无法判断,为什么这些函数没被调用。
嗯....简单地来讲就是一个void型函数的地址怎么赋值给变量
lunat 2016-12-17
  • 打赏
  • 举报
回复
表达的不够清楚。 pEnginefuncs->pfnPlaySoundByIndex = &NewHookSoundIndex; 这只是一个赋值语句,把函数地址复制给一个变量,不是调用这个函数。 按照你的代码来看,函数指针是存储在pEnginefuncs里面的,调用发生在Initialize函数之后。以你贴出来的代码,无法判断,为什么这些函数没被调用。
HeiYanXiaoHuai 2016-12-17
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
请给出这两个函数类型的完整声明:pEnginefuncs->pfnPlaySoundByIndex 、NewHookSoundIndex;
抱歉是我疏忽了。。在在里:

typedef int							(*pfnEngSrc_pfnHookUserMsg_t )			( char *szMsgName, pfnUserMsgHook pfn );
typedef void						(*pfnEngSrc_pfnPlaySoundByIndex_t )	( int iSound, float volume );

typedef struct cl_enginefuncs_s
{
	pfnEngSrc_pfnHookUserMsg_t				pfnHookUserMsg;
	pfnEngSrc_pfnPlaySoundByIndex_t			pfnPlaySoundByIndex;
}
ztenv 版主 2016-12-17
  • 打赏
  • 举报
回复
请给出这两个函数类型的完整声明:pEnginefuncs->pfnPlaySoundByIndex 、NewHookSoundIndex;

64,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧