破坏兼容性问题 我正在把一个比较老的项目从C++ Builder 2009移植到XE5。在旧项目中,Unicode字符串的编译器选项设置为“\u TCHAR映射到:char”。这在旧项目中效果很好
在移植它时,我在XE5中设置了相同的编译器选项。但我仍然会遇到如下代码的编译器错误:破坏兼容性问题 我正在把一个比较老的项目从C++ Builder 2009移植到XE5。在旧项目中,Unicode字符串的编译器选项设置为“\u TCHAR映射到:char”。这在旧项目中效果很好,c++,unicode,c++builder,vcl,C++,Unicode,C++builder,Vcl,在移植它时,我在XE5中设置了相同的编译器选项。但我仍然会遇到如下代码的编译器错误: std::string str = String(some_component.Text).t_str(); 这会产生以下错误: [bcc32警告]file.cpp(89):W8111访问已弃用 实体“UnicodeString::t_str()const” [bcc32错误]文件.cpp(89):E2285找不到的匹配项 '运算符字符串::=(wchar\u t*)' 显然,XE5已经决定String::t
std::string str = String(some_component.Text).t_str();
这会产生以下错误:
[bcc32警告]file.cpp(89):W8111访问已弃用
实体“UnicodeString::t_str()const”
[bcc32错误]文件.cpp(89):E2285找不到的匹配项
'运算符字符串::=(wchar\u t*)'
显然,XE5已经决定String::t_str()
应该给我一个wchar\u t*
而不是char*
,尽管我已经按照上面所述设置了编译器选项
我如何解决这个问题
我很清楚,C++ Builder已经采取了步骤,在内部使用Unicode(甚至在2009版本中),但这是一个具有200K LOC的旧项目。将其更新为Unicode将是一项艰巨的任务,优先级很低
编辑
我可以通过将代码更改为
std::string str = AnsiString(some_component.Text).c_str();
但这意味着我必须在许多地方更改代码。有没有更好的方法不需要重写代码?当CB2009首次引入UnicodeString::t_str()时,它会返回一个
char*
或wchar\u t*
,具体取决于TCHAR映射到的对象。为了返回一个char*
,它修改了UnicodeString的内部数据,使其成为Ansi(从而打破了UnicodeString是Unicode字符串的约定)这是临时的,用于迁移目的,而人们仍在重新编写代码以支持Unicode。这种中断是可以接受的,因为RTL有特殊的逻辑来处理Ansi编码的UnicodeString(和Unicode编码的AnsiString)值。然而,这是危险的代码。在几个版本之后,当人们有足够的时间迁移时,这个RTL逻辑就被删除了,UnicodeString::t_str()
只被锁定到wchar\u t*
,以匹配UnicodeString::c_str()
不要再使用t\u str()
这就是它现在被标记为不推荐的原因。如果需要将UnicodeString传递给需要Ansi数据的对象,则转换为中间AnsiString是正确且安全的方法。这就是现在的情况。如果没有其他问题,你可以求助于#define String(a)AnsiString(a)好的,我想我只需要将转换为AnsiString+c_str()并重写代码。还有一点奇怪的是,C++编译器有一个内部的<>代码>字符串< /C> >,现在它与C++标准字符串不兼容100%。除非C++11或其他东西重新制作std::string以与wchar一起使用,否则C++Builder的System::string
、System::Char
、和System::PChar
别名都是为了与Delphi的原生string
、Char
和PChar
类型兼容而存在的。在CB2009中,它们分别映射到UnicodeString
、wchar\u t
和wchar\u t*
。在早期版本中,它们映射到AnsiString
、char
和char*
。它们与C++ STL无关。不同的框架,不同的类型。STLstd::string
类型仍然使用char
。对于wchar\u t
,使用std::wstring
(C++11还添加了新的std::u16string
和std::u32string
类型)。