使用Address作为标量值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Address作为标量值相关的知识,希望对你有一定的参考价值。

我试图使用AfxBeginThread了解一些遗留代码。

据我所知,LPVOID被定义为指向void对象的指针。我有这个功能:

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:

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

答案

出现此警告是因为您正在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?

另一答案

不是100%确定这是指针的正确使用

你有正确的预感。不,它没有正确使用指针。

您可以传递指向该函数的指针。

int ch1 = 1;
int* ptr = &ch1;
AfxBeginThread(Start(), ptr);

以上是关于使用Address作为标量值的主要内容,如果未能解决你的问题,请参考以下文章

SQL 标量值函数

预期标量值:MATLAB Coder

推后是不是影响标量值...(Raku)

在 SQL Server 中计算 GS1 校验位的标量值函数

出现错误:“ValueError:如果使用所有标量值,则必须传递索引”将 ndarray 转换为 pandas Dataframe

如何使用条件索引在单元格上获取标量值