我有以下c ++代码:
#include "stdafx.h"
#include <atlstr.h>
int _tmain(int argc, _TCHAR* argv[])
{
CString OFST_PATH;
TCHAR DIR_PATH[MAX_PATH];
GetCurrentDirectory(MAX_PATH, DIR_PATH);
OFST_PATH.Format(DIR_PATH);
CHAR *pOFST_PATH = (LPSTR)(LPCTSTR)OFST_PATH;
return 0;
}
我想了解为什么程序结束时pOFST_PATH
的值是&#34; c&#34;?变量(LPSTR)(LPCTSTR)
的{{1}}投射对那里写的整条路径做了什么?
正如您在以下窗口中看到的,当对变量值进行调试时:
答案 0 :(得分:7)
CString
和LPCTSTR
都基于TCHAR
,wchar_t
定义UNICODE
时(在您的情况下,就像我一样)可以通过调试器中argv
的值来判断。当你这样做时:
(LPCTSTR)OFST_PATH
这没关系,因为CString
有一个转化运算符LPCTSTR
。但定义UNICODE
后,LPCTSTR
为LPCWSTR
,a.k.a。wchar_t const*
。它指向一个utf16字符数组。该数组中的第一个字符是L'c'
(这是'c'
的宽字符版本)。 L'c'
的字节在内存中看起来像这样:0x63 0x00
。这是字母'c'的ASCII码,后跟零。因此,当您将CString
转换为LPCTSTR
时,这是有效的,但是,您的下一次转换:
(LPSTR)(LPCTSTR)OFST_PATH
那是无效的。 LPSTR
为char*
,因此您将wchar_t const*
视为char*
。那么你的调试器假设当它看到char*
时,它正在查看一个空终止的窄字符串。如果你从上面记住第一个字符的字节值是什么,它是字母'c'的ASCII值,后跟零。因此,调试器将此视为一个以字母“c”组成的空终止字符串。
故事的寓意是,如果你不明白他们做了什么,以及他们是否合适,不要使用c式演员表。