作者:广东在线游戏网日期:
返回目录:游戏资讯
你的问题没有错知误。
你定义了一个函道数指针。名字叫 start_routine 。
这个函数的返回值是void *(一个指针)
参数是void *(一个指针)
一般这种写法最好用内typedef void* (*start_routine)(void *)
然后用容start_routine当作一种类型来使用。
如:
start_routine pfoo;
调用的时候:
*pfoo(p);
这样是编译通过了,但是不妥当,可能会造成程序崩溃
void ThreadFunc(int a ,int b)的函数定义了两个复变量,在编译成汇编代码之后,API以为你这个函数规则是正常的ThreadProc规则进而调用函数时可能造成堆栈不平衡的错误,不建议使用。
至于为什么可以,是因为制C/C++的灵活性,其实强制CreateThread函数的LPTHREAD_START_ROUTINE这个参数只是个函数指针,换句话说,只要你内存里有这百个函数的地址,就能够编译通过,这些内容如果你学习了汇编语言之后就能更深刻地理解了。
编译通过并不代表运行度正常,你的做法其实是很危险的,很有可能把程序弄崩溃,这就是C/C++的灵活性带来的副作用。
函数指针强转尽量不要有,仅用于类型实际是相同知的,但定义的变量类型不同,道如
另一个程序员写了段代码,要求你提供一个函数指针,类型如下:
typedef int (*ftype)(int,int);
但你写的函回数是 unsigned int fun(unsigned int,unsigned int),参数一个有符号,一个无符号,在你知道符号不影响结果的情况下,可以强制转答换。
这里和调用约定有关,默认的调用约定是__cdecl,叫做调用者平栈来.此时函数的声明只是说期望从堆栈得到那些参数.如果你的声音和调用者所期望的不一致,只是会造成函数读到自错误的参数值或是丢弃一部分参数,不会影响程序的运行(需要修改参数的除外),所以你的程序能正常运行.
这里扩展百说下,WINDOWS的系统API的调用约定是__stdcall,这叫用被调用者平栈,也是就说在函数返回时由函数平栈,所以你调用WINAPI时参数出现问题,程序一定运行不了.
至于返回值,是放在EAX寄存器里的度,不管你函数是否有返回值,调用都者是能从EAX里得到值的,只是不正确罢了.