c++ 为什么可以将整数转换为void指针,而不能使用CString?

pjngdqdw  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(196)

提醒一下,我引用的是一个工作代码,我试图实现相同的方法,但使用的是CString
下面的方法有效,将整数转换为void指针:

  1. void **pParam = new void*[2];
  2. pParam[0] = reinterpret_cast<void*>(this);
  3. pParam[1] = reinterpret_cast<void*>(iTrayNumber);
  4. _beginthreadex(NULL, 0, &CInspectionDone::InspectionDoneThread, reinterpret_cast<void*>(pParam), 0, NULL);

然而,如果我对CString执行相同的操作,我会得到以下错误:

  1. CString strTest = _T("Hello");
  2. void **pParam = new void*[2];
  3. pParam[0] = reinterpret_cast<void*>(this);
  4. pParam[1] = reinterpret_cast<void*>(strTest);

错误数:

  1. 1>d:\v4\apps\serialcomm.cpp(160) : error C2440: 'reinterpret_cast' : cannot convert from 'CString' to 'void *'
  2. 1> Conversion requires a constructor or user-defined-conversion operator, which can't be used by const_cast or reinterpret_cast

是不是因为根本上你不能对CString做同样的事情?我试着在网上搜索,它说reinterpret cast的功能是将一种数据类型的指针转换为另一种。除非指针只是整数,它被接受进行转换。
如果对此有任何解释,我将非常感谢!提前感谢。

23c0lvtd

23c0lvtd1#

reinterpret_cast执行许多特定的类型转换,所有这些类型转换只有在相当特殊的情况下才需要。
reinterpret_cast允许的转换之一是将一个对象指针类型转换为另一个对象指针类型。此操作的效果取决于确切的类型。在转换为char*unsigned char*以获取对象的对象表示形式时,此操作非常有用。
reinterpret_cast<void*>没有意义,因为从任何指向void*的(非const/volatile)对象指针类型是隐式的。根本不需要强制转换。即使需要强制转换,static_cast也会执行相同的操作,而且风险更小(因为大多数reinterpret_cast的使用都可能以未定义的行为结束)。这种转换不会改变指针值。void*将指向与原始指针相同的对象。然后,您需要稍后使用static_castvoid*转换回原始类型(也不需要reinterpret_cast)。转换为其他类型几乎总是以未定义的行为结束。
reinterpret_cast可以执行的另一个转换是对象类型指针和整数之间的转换。(然后返回)。同样,唯一有用的方法是将从指针获得的整数值转换回其原始类型。将一个随机的整数值转换成一个指针也不太可能得到一个可用的指针值。所有这些都是由实现定义的(除了指针-〉整数-〉指针的往返转换,保持值不变)。
然而,在reinterpret_cast的可能转换列表中,没有特定的转换允许将类类型转换为指针类型。因此,CString不能以这种方式转换为void*。但是,无论如何,也不会有任何有意义的方式来进行这样的转换。您希望得到的指针值表示什么?
这里不需要任何reintepret_cast。一个简单的结构就可以保存正确类型的类型:

  1. struct Params {
  2. CInspectionDone* a;
  3. int b;
  4. };
  5. void *pParam = new Parames{this, iTrayNumber};
  6. _beginthreadex(NULL, 0, &CInspectionDone::InspectionDoneThread, pParam, 0, NULL);

然后,InspectionDoneThread可以使用例如static_cast<Params>(arg)->a访问参数,并使用delete static_cast<Params>(arg);删除参数。
或者更好地使用现代C++。由于十年前有std::thread,它根本不需要任何指针。InspectionDoneThread可以只是一个非静态成员函数,以整数作为参数,具有适当的类型,而不需要是一个static成员函数,具有void*参数。然后:

  1. auto mythread = std::thread(&CInspectionDone::InspectionDoneThread, this, iTrayNumber);

或者用λ:

  1. auto mythread = std::thread([&]{ InspectionDoneThread(iTrayNumber); });
展开查看全部

相关问题