PCXSTR是什么,它和LPCTSTR一样吗?

sta*_*iet 3 c++ string winapi mfc

这是一个新手问题,所以请理解。

我尝试了解LPCTSTRLPCWSTR等等,我以为我理解了这些,并且我了解了T它根据UNICODE设置而变化的含义。

但是,我在文档的预定义类型”部分中找到了PCXSTRPCYSTR等。CStringTCStringT

这里有几个问题。

  1. PCXSTRPCYSTRXCHAR、等是什么YCHAR,它们与 、 等有什么LPCTSTR关系TCHAR

  2. 上述 MSDN 部分中的“相同/相反字符类型”是什么意思?

  3. CSimpleStringT::operator PCXSTR()源代码中有( atlsimpstr.h)。当我编写一些类似 的代码时,它似乎与(Visual Studio“转到定义”将我带到,而不是)myCString.operator LPCWSTR();相同。VS甚至只建议,不建议。那么,(与我的 Unicode 设置中的相同)与 相同吗?这里发生了什么?myCString.operator PCXSTR();operator PCXSTR()operator LPCWSTR()operator LPCWSTRoperator PCXSTRLPCWSTRLPCTSTRPCXSTR

Aco*_*gua 5

只是为了说明(CStringT减少到绝对必要,它实际上有第二个模板参数;并且只是一个演示,实际实现很可能看起来不同):

\n
#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};\n
Run Code Online (Sandbox Code Playgroud)\n

细节可能有所不同,尤其是真正的CStringT实现,但至少它们会做一些语义上相同的事情。

\n

TCHAR仅依赖于UNICODE是否启用 \xe2\x80\x93X/YCHAR相比之下,类型独立于并依赖于CStringT实例化的类型。从上面的代码片段中,自我和相反的含义也应该很明显。

\n

实际上有三个而不是两个独立的(相关的)字符别名:

\n
TCHAR\nCStringT<char>::XCHAR\nCStringT<wchar_t>::XCHAR\n
Run Code Online (Sandbox Code Playgroud)\n

因此CStringT<char>::PCXSTR相当于 ,LPCSTR而相反CStringT<wchar_t>::PCXSTR相当于LPCWSTR

\n

最后,您可以通过相当于UNICODE来启用字符串类型。CStringT<TCHAR>PCXSTRLPCTSTR

\n

  • @sergiol 这只是为了演示,请注意“语义上等效的东西”* – 我什至几乎假设“CStringT”实际上“不是”这样实现,因为它们可能需要覆盖早于 C++11 的标准。这可能看起来像[this](https://godbolt.org/z/nPnTKre33),但还有许多其他可能性...... (4认同)