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