我现在正在一个基于DirectX的项目上工作,但遇到了一些问题。尽管DirectX SDK严重依赖于Windows数据类型如LPSTR
、LPCSTR
等,但我使用自己的类时却使用了std::string
,这让混合处理字符串看起来有点奇怪。虽然我的问题很模糊,请问你建议我是继续使用string
还是使用不同字符串类型的Windows指针以保持一致性呢?
LPSTR
是char*
的别名,LCPSTR
是const char*
的别名,因此你的问题实际上听起来像是 "我应该使用C++字符串还是C字符串?"
嗯,C++ std::string
有一个成员函数称为c_str()
(或STL兼容的等效data()
函数),返回一个(不可修改的)C字符串。因此,每当一个函数接受LPCTSTR
时,可以将c_str()
的输出作为参数提供。
我建议你尽可能使用C++ std::string
,这样更安全。
.data()
或&str[0]
来获取char*
。 - Rapptzdata()
和c_str()
返回的缓冲区是未定义行为。而且据我所知,它们都返回const char *
。 - Andy Prowl&str[0]
,即 char* str2 = &str[0];
。我承认我不确定 data()
返回的是 const char*
还是 char*
。 - RapptzLPSTR
和LPCSTR
。这些都是基于char
的定义。如果你不进行转换,就不能将wstring::c_str()
的输出传递给接受LPCSTR
的函数。但是,如果你的API接受LPWSTR
和LPCWSTR
,或者它接受LPTSTR
并且你的项目正在使用Unicode字符,则一定要使用std::wstring
,因为Windows操作系统正在使用Unicode字符串,所以大多数情况下都会执行转换。 - Andy Prowl&str[0]
来修改缓冲区,而data()
和c_str()
是等效的。还要注意,所有这些便利都仅适用于C++11,其中字符串缓冲区必须具有连续的字符。 - chris在@Andy Prowl的回答基础上,您可能希望使用"T"字符串编写所有代码(即使用LPTSTR
而不是LPSTR
或LPWSTR
)。T的确切类型(真正的TCHAR
)是在编译时根据您是否定义了UNICODE
和_UNICODE
#defined
来设置的。这使您具有兼容性。
您仍然可以使用C++字符串来实现此技术,方法是从basic_string<>
派生出一个tstring
类:
typedef std::basic_string<TCHAR> tstring;
std::wstring
和wchar_t
(或Unicode构建中对应的CStringW
)而不是旧的ANSI / MBCS兼容的TCHAR
模型。我认为在现代,TCHAR
模型已经过时且无用。 - Mr.C64
std::string
明显更易于使用,并且访问底层的 C 字符串只需要额外的几个字符。尽管如此,在 C++03 中,与 C 接口使用它要比在 C++11 中麻烦一些。 - chrisstd::wstring
。请参见std::wstring VS std::string。 - Jesse Good