PCXSTR、PCYSTR等字符类型解析及与LPCTSTR的关系疑问
关于CStringT中PCXSTR、XCHAR等类型的疑问解答
1. PCXSTR、PCYSTR、XCHAR、YCHAR是什么,与LPCTSTR、TCHAR有何关系?
- 这些是CStringT模板体系里的模板参数相关别名,核心是适配CStringT对ANSI/Unicode双字符类型的支持:
XCHAR是CStringT实例化时指定的原生字符类型:比如用CStringW(Unicode版)时,XCHAR就是wchar_t;用CStringA(ANSI版)时,XCHAR就是char。而TCHAR是全局层面的宏,会随项目UNICODE开关切换char/wchar_t,CString类型就是基于TCHAR实例化的CStringT,此时XCHAR和TCHAR完全等价。PCXSTR是const XCHAR*的别名:对应到全局类型里,CStringW的PCXSTR就是LPCWSTR,CStringA的PCXSTR就是LPCSTR,CString(基于TCHAR)的PCXSTR则等于LPCTSTR。YCHAR和PCYSTR是与XCHAR相反的字符类型:如果XCHAR是wchar_t,YCHAR就是char;如果XCHAR是char,YCHAR就是wchar_t。PCYSTR就是const YCHAR*的别名。
2. MSDN章节中的「相同/相反字符类型」指什么?
这里的“相同/相反”是针对CStringT的字符编码方向定义的:
- 相同字符类型:当前CStringT实例使用的字符类型(即XCHAR对应的类型),比如
CStringW的相同类型是Unicode(wchar_t),CStringA的相同类型是ANSI(char)。 - 相反字符类型:和当前实例编码反向的类型(即YCHAR对应的类型),比如
CStringW的相反类型是ANSI,CStringA的相反类型是Unicode。这个设计是为了让CStringT能便捷地在ANSI和Unicode字符串之间做转换。
3. 在Unicode环境下LPCTSTR(即LPCWSTR)是否等同于PCXSTR?
是的,完全等价。
原因是:Unicode环境下,项目默认的CString是基于wchar_t实例化的CStringT,此时模板参数对应的XCHAR就是wchar_t,PCXSTR即为const wchar_t*;而LPCTSTR在UNICODE宏开启时,就是LPCWSTR,也就是const wchar_t*。
VS跳转时指向PCXSTR运算符,是因为CStringT的类型转换运算符是用模板参数别名PCXSTR定义的,在Unicode环境下这个别名刚好就是LPCWSTR,编译器会自动匹配,VS的跳转功能也就指向了这个通用的模板实现。
内容的提问来源于stack exchange,提问作者starriet 차주녕
相关产品推荐
相关产品推荐

