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

Posted

技术标签:

【中文标题】无法从“const char *”转换为“LPCTSTR”【英文标题】:cannot convert from 'const char *' to '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。 【参考方案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();

【讨论】:

相关链接:Is TCHAR still relevant?

以上是关于无法从“const char *”转换为“LPCTSTR”的主要内容,如果未能解决你的问题,请参考以下文章

error C2440: “=”: 无法从“const char [18]”转换为“LPCWSTR”

error C2440: “=”: 无法从“const char [18]”转换为“LPCWSTR”

vs2017 :C2440 错误,无法从 const char[] 转换为 char*问题解决

vs2017 :C2440 错误,无法从 const char[] 转换为 char*问题解决

c++ 从 LPCTSTR 转换为 const char *

error C2664: “int CWnd::MessageBoxW(LPCTSTR,LPCTSTR,UINT)”: 无法将参数 1 从“const char [9]”转换为“LPCTSTR”