我应该在DirectX中使用std :: string或Windows数据类型吗?

时间:2013-01-31 21:08:59

标签: c++ windows string winapi directx

我一直在研究基于DirectX的项目,我正在努力解决问题。虽然DirectX SDK在很大程度上依赖于LPSTRLPCSTR等Windows数据类型,但我一直在使用我自己的类std::string,这很容易使用,但它看起来很像奇怪的是混合两种处理字符串的方式。虽然这是一个模糊的问题,但您有什么建议 - 我应该使用string或Windows指针处理不同的字符串类型以保持一致性吗?

3 个答案:

答案 0 :(得分:5)

LPSTR只是char*的别名,LCPSTRconst 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而非LPSTRLPWSTR)对所有内容进行编码。根据您是TCHAR还是UNICODE _UNICODE,在编译时设置T的确切类型(真正#defined)。这使您可以兼容两者。

通过从tstring派生basic_string<>类,您仍然可以使用C ++字符串:

typedef std::basic_string<TCHAR> tstring;