2013-01-31 27 views
4

我一直在做一个基于DirectX的项目,我正在努力寻找一些东西。尽管DirectX SDK严重依赖于Windows数据类型,如LPSTR,LPCSTR,...我一直在使用我自己的类std::string,这很容易处理,但将两种字符串混合使用看起来很奇怪。虽然这是一个模糊的问题,但你有什么建议 - 我应该使用string还是使用Windows指针来处理不同的字符串类型以保持一致性?我应该在DirectX中使用std :: string或Windows数据类型吗?

+0

'std :: string'远远更易于使用,并且对底层C字符串的访问只有少数几个额外的字符。也就是说,在C++ 03中使用C来接口比在C++ 11中使用C更麻烦。 – chris

+4

我建议在Windows上使用'std :: wstring'。参见[std :: wstring VS std :: string](http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring)。 –

+0

请阅读:http://www.utf8everywhere.org/#how – qPCR4vir

回答

4

LPSTR仅仅是char*LCPSTR别名是const char*一个别名,所以你的问题实际上听起来像“我应该用C++字符串或C字符串?”

好,C++ std::string具有称为c_str()一个成员函数(或STL兼容性等效data()函数)返回(不可修改)C字符串。因此,只要函数接受LPCTSTR,就可以提供c_str()的输出作为参数。

我建议你尽可能使用C++ std::string,这样更安全。

+0

为了完整起见,'.data()'或'&str [0]'得到'char *'。 – Rapptz

+0

@Rapptz:写入由data()和c_str()返回的缓冲区虽然是UB。另外,据我所知,他们都返回'const char *' –

+0

我知道Windows数据类型只是C字符串,但我想看看其他人如何处理“真正的C++”代码和这些历史遗留物的混合在整个WinAPI中使用。谢谢你的建议。 –

1

大厦@Andy四处寻觅的答案,你可能想用“T”字符串代码一切(即LPTSTR代替LPSTRLPWSTR)。 T的确切类型(确实是TCHAR)是在编译时根据您是否有UNICODE_UNICODE#defined设置的。这可以让你兼容两者。

您仍然可以从basic_string<>使用C++字符串使用这种技术通过获取一tstring类:

typedef std::basic_string<TCHAR> tstring; 
+3

在现代Win32 C++代码上,我只是在Windows上使用UTF-16(UTF-8在应用程序边界之外),并且在Unicode构建中只使用std :: wstring和wchar_t(或CString)对应于'CStringW'),而不是旧的ANSI/MBCS兼容的'TCHAR'模型。我认为'TCHAR'模型在现代已经过时并且毫无用处。 –

+0

好点。 +1。但是谈到现代时代,Win32和DirectX呢?没有更新的语言(C#)和API(WPF)也通过它们吗?顺便说一句,@C64先生谈论过时的讽刺并不会让我失望。 :) –

+1

说'传给他们'没有意义,因为这些新技术是建立在老一代之上的。今天它们仍然很有用。但是,除了旧代码库或向后兼容性外,'TCHAR'几乎没有什么用处。 –

2

在现代C++代码,我只想用一个强大的字符串类std::string,或更好的std::wstringUnicode支持Windows的UTF-16。然后,您可以在API边界处转换为“原始”C字符串

要获得一个只读“原始”C字符串指针,可以使用std::[w]string::c_str()方法。

相反,如果你想修改std::[w]string缓冲区,可以先调用.resize()法制备的字符串缓冲区,使其足够大;那么您可以使用&str[0]访问这些API的内部缓冲区,而不需要写入它。

请注意,在Windows特定的代码中,ATL的CString是您可能想要使用的另一个方便的字符串类。它具有一些平台特定的便利设施,如从资源加载字符串(这对于应用本地化非常有用)。

由于CString提供了隐式转换为LPCTSTR,因此您可以将CString实例传递给预期为原始LPCTSTR的API。相反,如果您需要修改内部缓冲区,则可以使用GetBuffer()/ReleaseBuffer()方法。

相关问题