C++ 串。TCHAR LPWCS LPCTSTR CString。这是什么,简单,快
错误(格式错误):C++ 串。TCHAR LPWCS LPCTSTR CString。这是什么,简单,快,c++,string,winapi,C++,String,Winapi,错误(格式错误): 错误C2664:'void ATL::CStringT::Format(const wchar\t *,…)':无法将参数1从“const char[15]”转换为“const wchar\t” 我只想得到这个程序启动的当前路径,并将其复制到CString中,以便在其他地方使用。我现在正试图通过追踪来查看路径。但是字符串,字符,字符数组,我永远都无法理解。有人能给我一个指针吗?我猜您是在Unicode模式下编译的 尝试将格式字符串包含在_T宏中,该宏旨在提供一种始终正确的方
错误C2664:'void ATL::CStringT::Format(const wchar\t
*,…)':无法将参数1从“const char[15]”转换为“const wchar\t”
我只想得到这个程序启动的当前路径,并将其复制到CString中,以便在其他地方使用。我现在正试图通过追踪来查看路径。但是字符串,字符,字符数组,我永远都无法理解。有人能给我一个指针吗?我猜您是在Unicode模式下编译的 尝试将格式字符串包含在_T宏中,该宏旨在提供一种始终正确的方法来提供常量字符串参数,而不管您是以Unicode还是ANSI模式编译:
error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t
*,...)' : cannot convert parameter 1 from 'const char [15]' to 'const wchar_t
公认的答案解决了这个问题。但这个问题也要求更好地理解Windows上所有字符类型之间的差异 编码 Windows(以及几乎所有其他系统)上的
char
是一个单字节。字节通常被解释为无符号值[0..255]或有符号值[-128..127]。(旧的C++标准保证仅为[-127…127 ]的签名范围,但大多数实现给出[-128…127 ]。我相信C++ 11保证更大的范围。)
ASCII是将[0..127]范围内的值映射到特定字符的字符映射,因此您可以将ASCII字符存储在有符号字节或无符号字节中,因此它将始终适合于字符
但是ASCII没有大多数语言所需的所有字符,因此字符集通常是通过使用字节中可用的其余值来扩展的,以表示某些语言(或语言系列)所需的其他字符。因此,虽然[0..127]几乎总是表示相同的内容,但像150这样的值只能在特定编码的上下文中解释。对于单字节字母表,这些编码称为代码页
代码页很有帮助,但并没有解决所有问题。为了正确解释特定文档,您必须始终知道使用了哪个代码页。此外,您通常无法编写使用不同语言的单个文档
此外,有些语言的字符数超过256个,因此无法将一个char
映射到一个字符。这导致了多字节字符编码的发展,其中[0..127]仍然是ASCII,但其他一些值是“转义”,这意味着您必须查看下面的一些char
s,以找出您真正拥有的字符。(最好将多字节视为可变字节,因为有些字符只需要一个字节,而另一些字符需要两个或更多字节。)多字节可以工作,但编码起来很麻烦
与此同时,内存变得越来越丰富,因此一些组织聚集在一起创建了Unicode,目的是实现值到字符的通用映射(用于适当模糊的“字符”定义)。最初,人们认为所有字符(或至少所有人都会使用的字符)都可以放入16位值,这很好,因为您不必处理多字节编码——每个字符只需使用两个字节,而不是一个字节。大约在这个时候,微软决定在Windows中采用Unicode作为文本的内部表示
WCHAR
因此Windows有一个名为WCHAR
的类型,一个两字节的值,表示一个“Unicode”字符。我在这里使用引号是因为Unicode已经超越了最初的双字节编码,所以Windows称之为“Unicode”的东西今天并不是真正的Unicode——它实际上是一种特殊的Unicode编码,称为UTF-16。在Unicode中,“字符”并不像在ASCII中那样简单,因为在某些语言中,字符以有趣的方式组合或影响相邻字符
较新版本的Windows在内部将这些16位WCHAR
值用于文本,但仍有许多代码是为单字节代码页编写的,甚至还有一些代码是为多字节编码编写的。那些程序仍然使用char
s而不是WCHAR
s。这些程序中的许多都必须与使用旧版本的Windows的人一起工作,旧版本的Windows内部仍然使用char
s,而新版本的Windows则使用WCHAR
。因此,我们设计了一种使用C宏和typedef的技术,这样您就可以以一种方式编写代码,并在编译时选择使用char
或WCHAR
TCHAR
为了实现这种灵活性,您可以对“文本字符”使用TCHAR
。在某些头文件(通常是
)中,TCHAR
将被类型定义为char
或WCHAR
,具体取决于编译时环境。Windows标头采用了如下约定:
out.Format(_T("\nInstall32 at %s\n"), tmp);
SetWindowText(hwnd, L"Hello World"); // only works in "Unicode" mode
LPTSTR
是指向TCHAR
s字符串的(长)指针
LPWSTR
是指向WCHAR
s字符串的(长)指针
LPSTR
是指向char
s字符串的(长)指针
(表示“long”的L
是16位日子的遗留物,当时我们有long、far和near指针。这些指针今天都已经过时了,但L
前缀倾向于保留。)
大多数接受和返回字符串的Windows API函数实际上都被两个版本所取代:A
版本(用于“ANSI”字符)和W
版本(用于宽字符)。(同样,历史遗留问题也体现在这些问题上。代码页方案通常被称为ANSI代码页,尽管我一直不清楚它们是否真正受ANSI标准的约束。)
因此,当您像这样调用Windows API时:
out.Format(_T("\nInstall32 at %s\n"), tmp);
SetWindowText(hwnd, L"Hello World"); // only works in "Unicode" mode
你真正做的是调用
SetWindowText(hwnd, L"Hello World"); // only works in "Unicode" mode
SetWindowText(hwnd, TEXT("Hello World")); // compiles in either mode