Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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+中的AnsiString和UnicodeString转换的AnsiString的区别+;建设者 我使用C++ Builder XE3,我遇到了一个奇怪的问题,ANSCORST。_C++_C++builder_Unicode String_C++builder Xe2_Ansistring - Fatal编程技术网

与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的链接是)我将尝试找出其中发生了什么。。。