跨模块调用指针函数

laibinghua 2012-04-10 10:01:10
麻烦大虾解答一下该问题:
一个指针函数在一个模块中注册,却在另一模块中调用,当调用指针函数的时候,却真正实现的调用的函数却不是对应的函数。该问题是否和各模块之间的内存堆栈有关系。敬请详解。3Q!
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2012-04-10
  • 打赏
  • 举报
回复
可以在编译时就加上HAVE_STANDBY这个宏,而不是在某个都文件中。
或者,调整一下你的include顺序。

另外,如果你的代码里一会有HAVE_STANDBY,一会没有HAVE_STANDBY,那么肯定会出问题。MiscInterface这个类的成员会不一样。
Red_angelX 2012-04-10
  • 打赏
  • 举报
回复
结构体都没编译进去那个成员,那么只可能是js_get_misc_inf里面把值填在了那块内存区域,
SystemStandby_getStandbyStatus指针越界访问了预期的内存.
laibinghua 2012-04-10
  • 打赏
  • 举报
回复
楼上的那个说法:我说明一下情况啊。
在编译的时候确实是在结构体中没有编译进去。但是在查看MiscInterface这个指针的时候,发现有SystemStandby_getStandbyStatus这个指针的值,而且也能取到正确的值。
Red_angelX 2012-04-10
  • 打赏
  • 举报
回复
#ifdef是预编译的,你要测试HAVE_STANDBY 起作用没有打印一下sizeof MiscInterface就可以查出来了.
最好是3在1前面
laibinghua 2012-04-10
  • 打赏
  • 举报
回复
(1)定义结构体
typedef struct{
int32 (*readDataBlock)(int32, uint32, void*);
#ifdef HAVE_STANDBY
SystemStandby*(*SystemStandby_getHandle)();
int(*SystemStandby_getStandbyStatus)();
int(*SystemStandby_ctrl)(SystemStandby *me, int name , void *arg);
int(*SystemStandby_proc)(SystemStandby *me, int msg, unsigned int p1, unsigned int p2);
#endif
}MiscInterface;

(2)调用
MiscInterface *misc_handle = js_get_misc_inf();
standbystatus = misc_handle->SystemStandby_getStandbyStatus() == 1 ? 2 : 1;

(3)#define HAVE_STANDBY
调用的时候调用SystemStandby_getStandbyStatus()这个函数的时候,跑到MiscInterface这个结构体中的其他函数readDataBlock去了。
HAVE_STANDBY这个宏已经定义。在其他头文件中定义。
会不会因为头文件的引用顺序问题导致的呢?
假设头文件引用顺序:(1)---> (3)---> (2)
这样的话,会不会也会导致该问题的重现
luciferisnotsatan 2012-04-10
  • 打赏
  • 举报
回复
帖些示意代码吧

64,282

社区成员

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

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