使用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 Server 中计算 GS1 校验位的标量值函数
出现错误:“ValueError:如果使用所有标量值,则必须传递索引”将 ndarray 转换为 pandas Dataframe