我正在尝试使用AfxBeginThread来理解一些旧代码。
据我了解,LPVOID被定义为指向空对象的指针。我有这个功能:
Start(LPVOID pParam){
...
int iTemp = (int)pParam;
...
}
然后致电:
int ch1 = 1;
AfxBeginThread(Start(), (LPVOID)ch1);
针对64位进行编译时,我收到以下编译器警告:
warning C4312: 'type cast': conversion from 'int' to 'LPVOID' of greater size
我是
有人可以帮助我了解其背后的机制吗?我一直在尝试在线查找一个示例,该示例以类似的方式使用AfxBeginThread,但到目前为止却失败了。
MS states:
该参数是单个值。函数在此参数中接收的值是创建线程对象时传递给构造函数的值。控制功能可以选择任何方式解释该值。可以将其视为标量值或指向包含多个参数的结构的指针,也可以将其忽略。
答案 0 :(得分:4)
发生此警告是因为您正在64位计算机上编译,其中sizeof(void*)
是8
个字节,而sizeof(int)
是4
。
处理此问题的适当方法是为ch1
使用整数类型,该整数类型与void
指针的大小相同。这是intptr_t
的确切用例。
因此,如果使用ìntptr_t
来保存ch1
变量,那将是安全的。另请参见this question: C++: Is it safe to cast pointer to int and later back to pointer again?
答案 1 :(得分:0)
不是100%肯定这是对指针的正确使用
您有正确的预感。不,不正确使用指针。
您可以将指针传递给该函数。
int ch1 = 1;
int* ptr = &ch1;
AfxBeginThread(Start(), ptr);