与C+中的AnsiString和UnicodeString转换的AnsiString的区别+;建设者 我使用C++ Builder XE3,我遇到了一个奇怪的问题,ANSCORST。
请看下面的代码与C+中的AnsiString和UnicodeString转换的AnsiString的区别+;建设者 我使用C++ Builder XE3,我遇到了一个奇怪的问题,ANSCORST。,c++,c++builder,unicode-string,c++builder-xe2,ansistring,C++,C++builder,Unicode String,C++builder Xe2,Ansistring,请看下面的代码 //Code 1: first time AnsiString temp1 = "test" ; funcA(temp1,temp1); //Code 2: second time String uTemp2 = "test"; AnsiString temp2 = uTemp2; funcA(temp2,temp2); 在我的想象中,它第一次运行得很好,但是第二次抛出了一个“坏格式”异常。即使我只是用代码2调用了funcA一次,问题仍然存在 因为在temp1或tem
//Code 1: first time
AnsiString temp1 = "test" ;
funcA(temp1,temp1);
//Code 2: second time
String uTemp2 = "test";
AnsiString temp2 = uTemp2;
funcA(temp2,temp2);
在我的想象中,它第一次运行得很好,但是第二次抛出了一个“坏格式”异常。即使我只是用代码2调用了funcA一次,问题仍然存在
因为在temp1或temp2中显示消息时没有区别。我完全不明白为什么两次电话给了我不同的结果
funcA来自第三个库,代码有点复杂。所以在我追踪这个库的代码之前,我想我应该知道代码1和代码2的区别
谢谢。我想到的第一件事是,没有来自字符串构造函数的AnsiString,因此无法将字符串类型分配给AnsiString。您没有提到编译器错误,因此听起来编译器为您做的事情是错误的 这篇文章提供了一种安全的方法 基本上,您需要在赋值中引用字符串变量char buffer,这样编译器才能做正确的事情 这是一个提供有关某些构造函数和可能的转换的信息的函数。就
funcA()
而言,将char*
或UnicodeString
分配给AnsiString
绝对没有区别。在这两种情况下,AnsiString
数据的内存表示形式是相同的。因此,无论您如何准备ansisting
,都必须存在导致错误的funcA()
本身内部的问题。但是如果不知道funcA()
的实际功能以及它需要什么输入,就无法诊断此问题。您必须跟踪funcA()
中的逻辑
您说
funcA()
来自第三方库。到底是什么样的图书馆?它是静态链接库还是外部DLL/BPL?这有很大的不同。如果它是一个外部DLL/BPL,那么您无法安全地通过DLL边界传递非POD数据,例如AnsiString
,除非DLL/BPL是使用与EXE完全相同的编译器、RTL和内存管理器编译的(对于BPL,这也意味着在BPL和EXE项目中启用运行时包)。如果不是这样,则DLL/BPL可能使用不同的RTL/MM,该RTL/MM以不同于EXE的方式解释内存中的ansisting
数据。CB2009中更改了ansisting
的内存数据,以包含新字段(即代码页和元素大小),因此,如果DLL/BPL是在较早的编译器版本中编译的,则当它尝试使用较新编译器中的ansisting
时,可能会发生错误(反之亦然)从什么库中获得代码< >代码>和<代码> ANStrys<代码>类?这些是来自C++ Builder XE3C++Builder的IDE,而不是类库。@安德鲁·卡隆,这将是VCLILN应该是C++ Builder中的这样的构造函数(至少在XE2之后)。事实上,我可以使用temp2=AnsiString(uTemp2)
。但是我还是得到了同样的例外。@Willy,你试过帖子中指定的方法了吗?我已经读过帖子了。但是,在C++ +Builder <代码>字符串< /COD>默认为“代码> UnoDeString 。我认为它们是不同的情况。这个答案是关于std::string的,问题是关于VCL string的,这个库名为Logog。为了将它与BCB一起用作静态库,我做了一些修改。我将尝试在其中跟踪。但是我仍然不明白在什么情况下,如果输入相同,结果会有所不同。你的链接是正确的。我刚刚将AnsiString
转换为Const Char*
作为参数,并将其转换为日志函数。在跟踪代码之后,我认为差异出现在::logog::String&operator=(const logog_CHAR*pstr)
(如果您感兴趣的话,.hpp的链接是)我将尝试找出其中发生了什么。。。