我现在一直在做一个基于 DirectX 的项目,我正在努力解决一些问题。尽管 DirectX SDK 严重依赖于 Windows 数据类型,如LPSTR
, LPCSTR
, ... 我一直在使用我自己的类std::string
,这很容易使用,但是混合两种处理字符串的方式看起来很奇怪。虽然这是一个模糊的问题,但您有什么建议 - 我应该使用string
s 还是使用 Windows 指针来处理不同的字符串类型以保持一致性?
3 回答
LPSTR
只是一个别名char*
和LCPSTR
是一个别名const char*
,所以你的问题实际上听起来像“我应该使用 C++ 字符串还是 C 字符串?”
好吧,C++std::string
有一个名为c_str()
(或与 STL 兼容的等效data()
函数)的成员函数,它返回一个(不可修改的)C 字符串。因此,任何时候函数接受一个LPCTSTR
,您都可以提供c_str()
作为参数的输出。
std::string
我建议您尽可能使用 C++ ,它更安全。
在现代 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()
方法。
基于@Andy Prowl 的回答,您可能希望使用“T”字符串(即LPTSTR
代替LPSTR
or LPWSTR
)对所有内容进行编码。T (真的)的确切类型TCHAR
是在编译时根据您是否拥有UNICODE
and来设置的_UNICODE
#defined
。这使您与两者兼容。
您仍然可以通过以下方式派生一个tstring
类来使用这种技术的 C++ 字符串basic_string<>
:
typedef std::basic_string<TCHAR> tstring;