C++ Space

C++, 3DGame

"危险"的函数指针类型的强制转换

查看一个与别人合作的项目的代码,发现了一个“隐秘”的问题,模拟这个问题如下:

typedef void ( * foo_type)( int int );

void foo1(
int int )
{
}

void foo2()
{
}

int  main()
{
  foo_type f 1
=   & foo1;                      // <1>
  foo_type f 2
=  (foo_type) & foo2;   // <2>
     return 0;
}
语句<1>肯定是对的,语句<2>强转一个函数类型到foo_type类型,我当时担心这会不会导致下面的语句导致运行时错误:
(*f2)(1,2);

幸运时这里它不会导致错误,这是由于:
<1>我们使用C/C++的默认函数调用方式__cdecl,也就是传入的函数参数是由调用者清理的;
<2>函数foo2没有使用任何参数。
这种做法肯定不值得提倡,但实际的项目中要避免还是不太容易,毕竟每个人的习惯不一样,还有为了与框架协同工作,有时候可能也不得不这样做。但是,一旦函数调用方式发生改变,或者被强转的那个函数是带参数的,而它又使用了这些参数,隐秘的错误也就埋下了。

posted on 2007-03-07 13:38 Kooyu 阅读(2718) 评论(1)  编辑 收藏 引用

Feedback

# re: "危险"的函数指针类型的强制转换 2007-04-06 00:24 zhuzhu

思考中~~~  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理