我正在将一个较旧的项目从C ++ Builder 2009移植到XE5。在旧项目中,Unicode字符串的编译器选项设置为“_TCHAR
映射到:char”。这在旧项目中运作良好。
移植时,我在XE5中设置了相同的编译器选项。但是我仍然会遇到像这样的代码的编译器错误:
std::string str = String(some_component.Text).t_str();
这会出现以下错误:
[bcc32警告] file.cpp(89):W8111访问已弃用 entity'UnicodeString :: t_str()const'
[bcc32错误] file.cpp(89):E2285无法找到匹配项 'operator string :: =(wchar_t *)'
显然XE5已经决定String::t_str()
应该给我一个wchar_t*
而不是char*
,即使我已经设置了如上所述的编译器选项。
我该如何解决这个问题?
我很清楚C ++ Builder已采取内部使用Unicode的步骤(即使在2009版本中),但这是一个200k LOC的旧项目。将其更新为Unicode将是一项非常低优先级的陡峭任务。
修改
我可以通过将代码更改为
来使其工作std::string str = AnsiString(some_component.Text).c_str();
但这意味着我必须在很多地方更改代码。有没有更好的方法不涉及重写代码?
答案 0 :(得分:8)
在CB2009中首次引入UnicodeString::t_str()
时,它返回char*
或wchar_t*
,具体取决于TCHAR映射到的内容。为了返回char*
,它改变了UnicodeString的内部数据以使其成为Ansi(因此打破了UnicodeString是Unicode字符串的合同)。 这是临时的用于迁移目的,而人们仍在重写代码以支持Unicode。这种破坏是可以接受的,因为RTL具有处理Ansi编码的UnicodeString(和Unicode编码的AnsiString)值的特殊逻辑。但是,这是危险的代码。在几个版本之后,当人们有足够的时间迁移时,此RTL逻辑被删除,UnicodeString::t_str()
仅被锁定到wchar_t*
,以匹配UnicodeString::c_str()
。 不要再使用t_str()
了!这就是为什么它现在被标记为已弃用。如果需要将UnicodeString传递给需要Ansi数据的东西,转换为中间AnsiString是正确且安全的方法。这就是现在的样子。