使用(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
);
展开
 我来答
46551489
2012-12-07 · TA获得超过261个赞
知道小有建树答主
回答量:79
采纳率:0%
帮助的人:119万
展开全部
这样是编译通过了,但是不妥当,可能会造成程序崩溃
void ThreadFunc(int a ,int b)的函数定义了两个变量,在编译成汇编代码之后,API以为你这个函数规则是正常的ThreadProc规则进而调用函数时可能造成堆栈不平衡的错误,不建议使用。

至于为什么可以,是因为C/C++的灵活性,其实强制CreateThread函数的LPTHREAD_START_ROUTINE这个参数只是个函数指针,换句话说,只要你内存里有这个函数的地址,就能够编译通过,这些内容如果你学习了汇编语言之后就能更深刻地理解了。
编译通过并不代表运行正常,你的做法其实是很危险的,很有可能把程序弄崩溃,这就是C/C++的灵活性带来的副作用。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式