使用(LPTHREAD_START_ROUTINE)强制转换和线程函数声明问题
CreateThread函数的第三个参数使用(LPTHREAD_START_ROUTINE)强制转换,查看头文件可知道这是一个函数指针,函数的返回值为DWORD型,参数为...
CreateThread 函数的第三个参数 使用(LPTHREAD_START_ROUTINE)强制转换,查看头文件可知道这是一个函数指针,函数的返回值为DWORD型,参数为LPVOID型。
typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
LPVOID lpThreadParameter
);
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
问题是我的线程函数声明为void ThreadFunc(int a ,int b)型为什么可以?声明为void ThreadFunc()型、ThreadFunc(void)型为什么也可以?
还有,MSDN里线程函数是这么声明的也和我的不同,为什么可以?
DWORD WINAPI ThreadProc(
LPVOIDlpParameter // thread data
); 展开
typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
LPVOID lpThreadParameter
);
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
问题是我的线程函数声明为void ThreadFunc(int a ,int b)型为什么可以?声明为void ThreadFunc()型、ThreadFunc(void)型为什么也可以?
还有,MSDN里线程函数是这么声明的也和我的不同,为什么可以?
DWORD WINAPI ThreadProc(
LPVOIDlpParameter // thread data
); 展开
1个回答
展开全部
这样是编译通过了,但是不妥当,可能会造成程序崩溃
void ThreadFunc(int a ,int b)的函数定义了两个变量,在编译成汇编代码之后,API以为你这个函数规则是正常的ThreadProc规则进而调用函数时可能造成堆栈不平衡的错误,不建议使用。
至于为什么可以,是因为C/C++的灵活性,其实强制CreateThread函数的LPTHREAD_START_ROUTINE这个参数只是个函数指针,换句话说,只要你内存里有这个函数的地址,就能够编译通过,这些内容如果你学习了汇编语言之后就能更深刻地理解了。
编译通过并不代表运行正常,你的做法其实是很危险的,很有可能把程序弄崩溃,这就是C/C++的灵活性带来的副作用。
void ThreadFunc(int a ,int b)的函数定义了两个变量,在编译成汇编代码之后,API以为你这个函数规则是正常的ThreadProc规则进而调用函数时可能造成堆栈不平衡的错误,不建议使用。
至于为什么可以,是因为C/C++的灵活性,其实强制CreateThread函数的LPTHREAD_START_ROUTINE这个参数只是个函数指针,换句话说,只要你内存里有这个函数的地址,就能够编译通过,这些内容如果你学习了汇编语言之后就能更深刻地理解了。
编译通过并不代表运行正常,你的做法其实是很危险的,很有可能把程序弄崩溃,这就是C/C++的灵活性带来的副作用。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询