sta*_*iet 3 c++ string winapi mfc
这是一个新手问题,所以请理解。
我尝试了解LPCTSTR,LPCWSTR等等,我以为我理解了这些,并且我了解了T它根据UNICODE设置而变化的含义。
但是,我在文档的“预定义类型”部分中找到了PCXSTR、PCYSTR等。CStringTCStringT
这里有几个问题。
PCXSTR、PCYSTR、XCHAR、等是什么YCHAR,它们与 、 等有什么LPCTSTR关系TCHAR?
上述 MSDN 部分中的“相同/相反字符类型”是什么意思?
CSimpleStringT::operator PCXSTR()源代码中有( atlsimpstr.h)。当我编写一些类似 的代码时,它似乎与(Visual Studio“转到定义”将我带到,而不是)myCString.operator LPCWSTR();相同。VS甚至只建议,不建议。那么,(与我的 Unicode 设置中的相同)与 相同吗?这里发生了什么?myCString.operator PCXSTR();operator PCXSTR()operator LPCWSTR()operator LPCWSTRoperator PCXSTRLPCWSTRLPCTSTRPCXSTR
只是为了说明(CStringT减少到绝对必要,它实际上有第二个模板参数;并且只是一个演示,实际实现很可能看起来不同):
#if UNICODE\n#define TCHAR wchar_t\n#else\n#define TCHAR \n#endif\n\ntemplate <typename BaseType>\nclass CStringT\n{\npublic:\n using XCHAR\n = std::conditional_t<std::is_same_v<wchar_t, BaseType>, wchar_t, char>;\n using YCHAR\n = std::conditional_t<std::is_same_v<wchar_t, BaseType>, char, wchar_t>;\n};\nRun Code Online (Sandbox Code Playgroud)\n细节可能有所不同,尤其是真正的CStringT实现,但至少它们会做一些语义上相同的事情。
TCHAR仅依赖于UNICODE是否启用 \xe2\x80\x93X/YCHAR相比之下,类型独立于并依赖于CStringT实例化的类型。从上面的代码片段中,自我和相反的含义也应该很明显。
实际上有三个而不是两个独立的(相关的)字符别名:
\nTCHAR\nCStringT<char>::XCHAR\nCStringT<wchar_t>::XCHAR\nRun Code Online (Sandbox Code Playgroud)\n因此CStringT<char>::PCXSTR相当于 ,LPCSTR而相反CStringT<wchar_t>::PCXSTR相当于LPCWSTR。
最后,您可以通过相当于UNICODE来启用字符串类型。CStringT<TCHAR>PCXSTRLPCTSTR