4

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

4

3 回答 3

5

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

好吧,C++std::string有一个名为c_str()(或与 STL 兼容的等效data()函数)的成员函数,它返回一个(不可修改的)C 字符串。因此,任何时候函数接受一个LPCTSTR,您都可以提供c_str()作为参数的输出。

std::string我建议您尽可能使用 C++ ,它更安全。

于 2013-01-31T21:12:50.077 回答
2

在现代 C++ 代码中,我只会使用一个健壮的字符串类,比如std::string,或者更好地std::wstring用于Windows 的Unicode UTF-16 支持。然后,您可以在 API 边界处转换为“原始”C 字符串。

要获取只读的“原始”C 字符串指针,可以使用std::[w]string::c_str()method.

相反,如果要修改 std::[w]string缓冲区,可以先调用.resize()方法准备字符串缓冲区,使其足够大;然后您可以使用&str[0]这些 API 访问内部缓冲区,而不是写入其中。

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

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

于 2013-01-31T21:31:55.597 回答
1

基于@Andy Prowl 的回答,您可能希望使用“T”字符串(即LPTSTR代替LPSTRor LPWSTR)对所有内容进行编码。T (真的)的确切类型TCHAR是在编译时根据您是否拥有UNICODEand来设置的_UNICODE #defined。这使您与两者兼容。

您仍然可以通过以下方式派生一个tstring类来使用这种技术的 C++ 字符串basic_string<>

typedef std::basic_string<TCHAR> tstring;
于 2013-01-31T21:22:33.877 回答