我一直在研究基于DirectX的项目,我正在努力解决问题。虽然DirectX SDK在很大程度上依赖于LPSTR
,LPCSTR
等Windows数据类型,但我一直在使用我自己的类std::string
,这很容易使用,但它看起来很像奇怪的是混合两种处理字符串的方式。虽然这是一个模糊的问题,但您有什么建议 - 我应该使用string
或Windows指针处理不同的字符串类型以保持一致性吗?
答案 0 :(得分:5)
LPSTR
只是char*
的别名,LCPSTR
是const char*
的别名,因此您的问题实际上听起来像“我应该使用C ++字符串还是C字符串?“
好吧,C ++ std::string
有一个名为c_str()
的成员函数(或STL兼容的等效data()
函数),它返回一个(不可修改的)C字符串。因此,只要函数接受LPCTSTR
,您就可以提供c_str()
的输出作为参数。
我建议您尽可能使用C ++ std::string
,它会更安全。
答案 1 :(得分:2)
在现代C ++代码中,我只使用健壮的字符串类,如std::string
,或更好std::wstring
用于 Unicode UTF-16支持用Windows。然后,您可以在API边界转换为“原始”C字符串。
要获取只读“原始”C字符串指针,您可以使用std::[w]string::c_str()
方法。
相反,如果你想修改 std::[w]string
缓冲区,你可以先调用.resize()
方法来准备字符串缓冲区,使它足够大;那么你可以使用&str[0]
访问那些API的内部缓冲区,而不是写入它的内容。
请注意,在Windows特定代码中,ATL的CString
是您可能想要使用的另一个方便的字符串类。它有一些特定于平台的便利设施,比如从资源加载字符串(这对于应用程序本地化很有用)。
由于CString
提供了对LPCTSTR
的隐式转换,因此您只需将CString
个实例传递给期望原始LPCTSTR
的API。相反,如果您需要修改内部CString
缓冲区,则可以使用GetBuffer()
/ ReleaseBuffer()
方法。
答案 2 :(得分:1)
基于@Andy Prowl的回答,您可能希望使用“T”字符串(即LPTSTR
而非LPSTR
或LPWSTR
)对所有内容进行编码。根据您是TCHAR
还是UNICODE
_UNICODE
,在编译时设置T的确切类型(真正#defined
)。这使您可以兼容两者。
通过从tstring
派生basic_string<>
类,您仍然可以使用C ++字符串:
typedef std::basic_string<TCHAR> tstring;