使用地址作为标量值

时间:2018-08-31 05:55:30

标签: c++ visual-studio pointers mfc

我正在尝试使用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

我是

  • 不是100%肯定这是对指针的正确使用
  • 为避免警告,我可以使用(LPVOID)PtrToInt(ch1)之类的辅助函数,但这对我来说也不正确

有人可以帮助我了解其背后的机制吗?我一直在尝试在线查找一个示例,该示例以类似的方式使用AfxBeginThread,但到目前为止却失败了。

MS states:

  

该参数是单个值。函数在此参数中接收的值是创建线程对象时传递给构造函数的值。控制功能可以选择任何方式解释该值。可以将其视为标量值或指向包含多个参数的结构的指针,也可以将其忽略。

2 个答案:

答案 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);