我一直在做一个基于DirectX的项目,我正在努力寻找一些东西。尽管DirectX SDK严重依赖于Windows数据类型,如LPSTR
,LPCSTR
,...我一直在使用我自己的类std::string
,这很容易处理,但将两种字符串混合使用看起来很奇怪。虽然这是一个模糊的问题,但你有什么建议 - 我应该使用string
还是使用Windows指针来处理不同的字符串类型以保持一致性?我应该在DirectX中使用std :: 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 *'。 – Rapptz
@Rapptz:写入由data()和c_str()返回的缓冲区虽然是UB。另外,据我所知,他们都返回'const char *' –
我知道Windows数据类型只是C字符串,但我想看看其他人如何处理“真正的C++”代码和这些历史遗留物的混合在整个WinAPI中使用。谢谢你的建议。 –
大厦@Andy四处寻觅的答案,你可能想用“T”字符串代码一切(即LPTSTR
代替LPSTR
或LPWSTR
)。 T的确切类型(确实是TCHAR
)是在编译时根据您是否有UNICODE
和_UNICODE
#defined
设置的。这可以让你兼容两者。
您仍然可以从basic_string<>
使用C++字符串使用这种技术通过获取一tstring
类:
typedef std::basic_string<TCHAR> tstring;
在现代Win32 C++代码上,我只是在Windows上使用UTF-16(UTF-8在应用程序边界之外),并且在Unicode构建中只使用std :: wstring和wchar_t(或CString)对应于'CStringW'),而不是旧的ANSI/MBCS兼容的'TCHAR'模型。我认为'TCHAR'模型在现代已经过时并且毫无用处。 –
好点。 +1。但是谈到现代时代,Win32和DirectX呢?没有更新的语言(C#)和API(WPF)也通过它们吗?顺便说一句,@C64先生谈论过时的讽刺并不会让我失望。 :) –
说'传给他们'没有意义,因为这些新技术是建立在老一代之上的。今天它们仍然很有用。但是,除了旧代码库或向后兼容性外,'TCHAR'几乎没有什么用处。 –
在现代C++代码,我只想用一个强大的字符串类像std::string
,或更好的std::wstring
Unicode支持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()
方法。
- 1. 我应该使用rvalues编写std :: string构造函数吗?
- 2. 我应该使用指针的std :: string
- 3. 应该在数据库中使用子类型/超类型吗?
- 4. 在std :: vector的构造函数中使用std :: string数据类型
- 5. 我应该修改String的原型吗?
- 6. 在使用之前,我应该检查boost :: shared_ptr或std :: shared_ptr吗?
- 7. 我应该总是在构造函数中使用std :: move吗?
- 8. 我们应该或不应该在模型中使用参数?
- 9. 我应该选择使用Windows或Mac的Python CS类吗?
- 10. 我应该使用std :: move函数返回std :: vector吗?
- 11. 我应该将EAV值放在数据类型表中吗?
- 12. 我应该在MySQL中使用哪些类型的数据?
- 13. 我应该在C++中使用这种600851475143的数据类型?
- 14. Windows窗体应用程序 - 我应该使用哪种数据库类型?
- 15. 我应该使用%TYPE引用代替Oracle中的标准数据类型吗?
- 16. 我应该在Windows或Cygwin上使用python吗?
- 17. 我应该使用核心数据吗?
- 18. 我应该使用double类型来保存mysql数据库中的坐标吗?
- 19. SQL Server 2008数据类型:我应该使用哪些数据类型?
- 20. 我应该在哪里使用OpenCL数据类型?
- 21. 我应该使用什么数据类型在核心数据中存储GUID?
- 22. 我应该根据数据库中的数据结构创建模型类吗?
- 23. 应该std :: common_type使用std :: decay?
- 24. PHP应该使用对象作为基本数据类型吗?
- 25. 您应该使用复杂数据类型的访问器吗?
- 26. 我应该为我的列使用哪种数据类型? [MySQL]
- 27. 我应该在AlarmManager中使用哪种类型的类型?
- 28. 我应该在我的类的std :: vector成员变量中使用std :: unique_ptr <T>吗?
- 29. 不存在从std :: string到std :: string的suiteble转换函数吗?
- 30. 在QML中使用std :: string
'std :: string'远远更易于使用,并且对底层C字符串的访问只有少数几个额外的字符。也就是说,在C++ 03中使用C来接口比在C++ 11中使用C更麻烦。 – chris
我建议在Windows上使用'std :: wstring'。参见[std :: wstring VS std :: string](http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring)。 –
请阅读:http://www.utf8everywhere.org/#how – qPCR4vir