LPSTR LPCTSTR解释

时间:2016-06-19 14:31:43

标签: c++ c-strings

我有以下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}}投射对那里写的整条路径做了什么?

正如您在以下窗口中看到的,当对变量值进行调试时:

enter image description here

1 个答案:

答案 0 :(得分:7)

CStringLPCTSTR都基于TCHARwchar_t定义UNICODE时(在您的情况下,就像我一样)可以通过调试器中argv的值来判断。当你这样做时:

(LPCTSTR)OFST_PATH

这没关系,因为CString有一个转化运算符LPCTSTR。但定义UNICODE后,LPCTSTRLPCWSTR,a.k.a。wchar_t const*。它指向一个utf16字符数组。该数组中的第一个字符是L'c'(这是'c'的宽字符版本)。 L'c'的字节在内存中看起来像这样:0x63 0x00。这是字母'c'的ASCII码,后跟零。因此,当您将CString转换为LPCTSTR时,这是有效的,但是,您的下一次转换:

(LPSTR)(LPCTSTR)OFST_PATH

那是无效的。 LPSTRchar*,因此您将wchar_t const*视为char*。那么你的调试器假设当它看到char*时,它正在查看一个空终止的窄字符串。如果你从上面记住第一个字符的字节值是什么,它是字母'c'的ASCII值,后跟零。因此,调试器将此视为一个以字母“c”组成的空终止字符串。

故事的寓意是,如果你不明白他们做了什么,以及他们是否合适,不要使用c式演员表。