感谢阅读。
我认为我在这方面已经很接近了,但我可以利用一些专业知识来理解为什么我对某事的尝试没有按照我期望的方式进行。
我(目前)需要的是将 long 类型(LONG,因为我实际上是在 VC++ 中,但我知道这只是一个 typedef)转换为 wchar_t *。我能够获得我想要的结果,但我无法理解为什么我认为应该起作用的方法……不起作用。这是实现我想要的结果的代码:
const std::wstring myString{ std::to_wstring(wRect.bottom) };
const wchar_t * myCharPointer{ myString.c_str() };
与我想采用的方法相比:
const wchar_t * lWind{ std::to_wstring(wRect.bottom).c_str() };
在 VS Community 中使用我的调试器,我确定 myCharPointer 指向正确的值(“600”),但是 lWind 被分配到指向(或者可能根本没有得到新的分配?)空字符串/空字符串。
我很好奇这两种方法的理论性能方面,即使用 2 行代码和 2 种不同类型的变量来获得我想要的值与 1 行代码相比。显然,会调用一些后端代码来执行这些方法中的每一种,但我不确定一种方法是否比另一种方法的性能成本更高。
我很感激人们对此的任何反馈;很可能我遗漏了一些明显的东西,我试图实现的总体目标甚至可能以更好的方式完成,但现在我想满足我的好奇心。谢谢!
最佳答案
to_wstring 按值返回一个 wstring。临时对象的析构函数在调用 c_str 后被调用,当它在下一行失去作用域时,指针将变为无效。
const wchar_t * lWind{ std::to_wstring(wRect.bottom).c_str() }; // after this line invalid pointer
您可以通过存储一个与 wchar_t 指针一样长的临时字符串来修复它。
std::wstring ws = std::to_wstring(100);
const wchar_t * lWind{ ws.c_str() };
关于c++ - 将 long 转换为 wchar_t *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38092099/