AnsiString和AnsiString在c++ builder中从UnicodeString转换而来的区别
Diffence with AnsiString and AnsiString transfered from UnicodeString in C++ builder
我正在使用c++ Builder XE3,我遇到了一个奇怪的问题与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或temp2中ShowMessage时没有区别。我完全不明白为什么两次电话给了我不同的结果。
funcA来自第三个库,代码有点复杂。所以在我跟踪这个库的代码之前,我想我应该知道Code1和Code2的区别是什么。
谢谢。
就funcA()
而言,给AnsiString
分配一个char*
或一个UnicodeString
是绝对没有区别的。在这两种情况下,AnsiString
数据的内存表示是相同的。因此,无论您如何准备AnsiString
, funcA()
本身内部一定存在导致错误的问题。但是,如果不知道funcA()
实际做什么以及它期望得到什么输入,就无法诊断这个问题。你必须跟踪funcA()
内部的逻辑。
你说funcA()
来自第三方库。这到底是一个什么样的图书馆?它是静态链接LIB,还是外部DLL/BPL?这有很大的不同。如果它是一个外部DLL/BPL,那么你不能安全地传递非pod数据,如AnsiString
,在DLL边界上,除非DLL/BPL已经与你的EXE(在BPL的情况下,这也意味着在BPL和EXE项目中启用运行时包)完全相同的编译器,RTL和内存管理器进行编译。如果不是这样,那么很可能DLL/BPL正在使用不同的RTL/MM来解释内存中的AnsiString
数据,而不是您的EXE。AnsiString
的内存数据在CB2009中更改为包括新字段(即代码页和元素大小),因此,如果DLL/BPL在较早的编译器版本中编译,则当它试图从较新的编译器中使用AnsiString
时,可能会发生不好的事情(反之亦然)。
我想到的第一件事是String构造函数中没有AnsiString,因此没有办法将String类型分配给AnsiString。你没有提到编译器错误,所以听起来像编译器正在为你做一些错误的事情。
这篇文章如何将字符串转换为AnsiString提供了一种安全的方法。
基本上你需要在赋值中引用String变量char buffer,这样编译器才能做正确的事情。
这是一个较旧的Builder AnsiString引用(1997),提供了一些可能的构造函数和转换的信息。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- AnsiString和AnsiString在c++ builder中从UnicodeString转换而来的区别