【问题标题】:cannot convert from 'const char *' to 'LPCTSTR'无法从“const char *”转换为“LPCTSTR”
【发布时间】:2018-03-30 13:44:25
【问题描述】:

我正在尝试将字符串转换为“LPCTSTR”,但是出现以下错误。

错误:

cannot convert from 'const char *' to 'LPCTSTR'

代码:

std::string str = "helloworld";
LPCTSTR lp = str.c_str();

也试过了:

LPCTSTR lp = (LPCTSTR)str.c_str();

但是,打印垃圾值。

【问题讨论】:

  • 记住str.c_str()的返回是临时的,你也不应该在这里投。
  • 您的构建系统中是否定义了UNICODE,所以LPCTSTRLPCWSTR?如果是这样:考虑使用std::wstring
  • 你调查过LPCTSTR到底是什么吗?
  • 停止使用 TCHAR 类型,它们在十多年前就不再有意义了。使用 mbstowcs() 或 MultiByteToWideChar() 将 char 字符串转换为 utf16。或者在这个 sn-p 中始终使用 wchar_t,std::wstring。

标签: c++ windows visual-studio tchar widestring


【解决方案1】:

LPCTSTR 表示(指向常量TCHAR 字符串的长指针)。

TCHAR 可以是 wchar_tchar,具体取决于您的项目设置。

如果在您的项目设置中的“常规”选项卡中,您的字符集是“使用多字节字符集”,那么TCHARchar 的别名。但是,如果将其设置为“使用 Unicode 字符集”,则 TCHARwchar_t 的别名。

您必须使用 Unicode 字符集,所以:

LPCTSTR lp = str.c_str();

在现实中:

// c_str() returns const char*
const wchar_t* lp = str.c_str();

这就是您收到错误的原因:

无法从“const char *”转换为“LPCTSTR”

您的线路:

LPCTSTR lp = (LPCTSTR)str.c_str();

在现实中:

const wchar_t* lp = (const wchar_t*) std.c_str(); 

std::string 中,字符是单字节,wchar_t* 指向它们将期望每个字符是 2+ 字节。这就是为什么你会得到无意义的值。

最好的办法是按照 Hans Passant 的建议 - 不要使用基于 TCHAR 的 typedef。在您的情况下,请改为:

std::string str = "helloworld";
const char* lp = str.c_str(); // or
LPCSTR lp = str.c_str();

如果你想使用宽字符,Windows 称之为 Unicode,那么你可以这样做:

std::wstring wstr = L"helloword";
const wchar_t* lp = wstr.c_str() // or
LPCWSTR lp = wstr.c_str();

【讨论】:

猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多