Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
破坏兼容性问题 我正在把一个比较老的项目从C++ Builder 2009移植到XE5。在旧项目中,Unicode字符串的编译器选项设置为“\u TCHAR映射到:char”。这在旧项目中效果很好_C++_Unicode_C++builder_Vcl - Fatal编程技术网

破坏兼容性问题 我正在把一个比较老的项目从C++ Builder 2009移植到XE5。在旧项目中,Unicode字符串的编译器选项设置为“\u TCHAR映射到:char”。这在旧项目中效果很好

破坏兼容性问题 我正在把一个比较老的项目从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

在移植它时,我在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_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无关。不同的框架,不同的类型。STL
std::string
类型仍然使用
char
。对于
wchar\u t
,使用
std::wstring
(C++11还添加了新的
std::u16string
std::u32string
类型)。