Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 串。TCHAR LPWCS LPCTSTR CString。这是什么,简单,快_C++_String_Winapi - Fatal编程技术网

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