导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
mmygod (mmygod)
★☆☆☆☆
-
盒子活跃会员
2018/2/14 10:46:30
标题:
c++ builder 10.2.2 LeftStr 定义冲突
浏览:1045
加入我的收藏
楼主:
在System.StrUtils.hpp里有两处LeftStr的定义 75行 extern DELPHI_PACKAGE System::AnsiString __fastcall LeftStr _DEPRECATED_ATTRIBUTE1("Moved to the AnsiStrings unit") (const System::AnsiString AText, const int ACount)/* overload */; 81行 extern DELPHI_PACKAGE System::UnicodeString __fastcall LeftStr(const System::UnicodeString AText, const int ACount)/* overload */; 在使用时比如 LeftStr("aaaa",1) 就会提示定义冲突 难不成要在"aaaa"前加上强转, LeftStr((UnicodeString)"aaaa",1), 也不知道啊是自己水平太差了 总感觉c++ builder 对这些unicode的使用比较的乱,
----------------------------------------------
-
作者:
boyla (土著巫师)
★☆☆☆☆
-
普通会员
2018/2/18 21:47:19
1楼:
@mmygod 引入Unicode处理后,在Windows平台上很多函数都是针对AnsiString和UnicodeString重载两个版本来处理的,LeftStr就是其中之一,通常的做法是使用下面的形式: AnsiString a = "abcdefg"; UnicodeString b = "abcdefg"; LeftStr(a, 1); LeftStr(b, 1); 这样就可以避免参数类型的转换造成编译器无法识别到底使用哪个函数。 LeftStr("abcdefg", 1);这种用法编译器是不能武断自动转换成AnsiString或UnicodeString,所以报错。 使用强制转换是可以的,相当于以下的用法: LeftStr(AnsiString("abcdefg"), 1); LeftStr(UnicodeString("abcdefg"), 1); 强制构造不同类型的变量,和直接声明赋值没有本质上的区别。
----------------------------------------------
妹聊的不是BUG是追求,哥写的不是CODE是梦想。
作者:
2018/2/18 23:42:11
2楼:
在c++里使用string,尽量写上L"",比如: LeftStr(L"aaaa",1),
----------------------------------------------
只有偏执狂才能生存!
作者:
mmygod (mmygod)
★☆☆☆☆
-
盒子活跃会员
2018/2/19 9:50:04
3楼:
谢谢上面两位的解释! 我总觉得没必要做这个兼容定义了, 应该全面转到UnicodeString , 彻底放弃AnsiString , 就算是为了兼容原先的老代码, 在新的编译器里编译还是要改的, 改动的工作量也不会小的
----------------------------------------------
-
作者:
2018/2/19 16:39:09
4楼:
楼上,是你不明白BCB存在的意义,不是让你换个语法去写Delphi(估计你停留在这一层),而是让你既能够使用VCL和Delphi的控件,又能够使用所有海量的C++的类库(比如boost)。而C++类库的字符串,必然是char*,这个是不用说的。这就是为什么delphi可以强制使用UnicodeString,而BCB不行的原因。你放心,人家做C++编译器的,理解水平不会比你差。 综合下来,BCB应该算是做项目天下无双的神器(就是编译速度有点慢),不知道为什么不仅没火起来,而且还彻底没落了下去。
----------------------------------------------
只有偏执狂才能生存!
作者:
2018/2/19 22:21:28
5楼:
楼主彻底放弃AnsiString是明智的选择,新版BCB字符串字符类型定义已和C++11的字符串字符类型定义相一致,都使用u8、u、U前缀标示字符类型,使用这些前缀符,事半功倍。新版BCB使用LLVM、Clang作为词法分析器和编译器,调用Windows API已能依据上下文自行识别应调用的版本,且已在新版BCB中提供前缀符L支持,能显示指明调用功能实现相同的函数的不同版本。 BCB没落最主要的原因是库的二进制数据结构与微软VC++的库的结构不同,虽有转换工具,但仅限于纯C语言编写、使用C编泽器或虽是C++编译器但指明为C代码进行编译的库,一些著名的最新库虽然满足上述两个条件,使用转换工具依然无效,比如intel mkl。BCB生产商与微软公司影响力不能相提并论,很多开源库生产商不愿意再投入资源使得原生支持BCB编译。BCB生产商“固执己见”,主要两个原由:兼容已投入巨量资源的delphi VCL;小公司力量有限,已无力承担更改所耗费的人力、财力。BCB的没落是有原因的。
----------------------------------------------
-
作者:
2018/2/19 23:04:32
6楼:
to lzj7015,你看一下这几篇文章: 一般情况下,C++函数都是__cdecl调用,因此只要获得源码,在函数前故意加上下划线,应该可以解决问题。而不是只能调用C语言的库。 而且,如果有源码的话,完全可以将别的类库加入源码中自行编译,没有源码的类库尽量不要使用,因为那样也是相当的不靠谱。 c++builder调用VC的dll以及VC调用c++builder的dll http://www.cnblogs.com/MaxWoods/p/4094872.html C++Builder及VC的库相互调用 http://www.cnblogs.com/MaxWoods/p/4094786.html 在 C++Builder 工程里调用 DLL 函数 http://www.cnblogs.com/MaxWoods/p/4094882.html 话说,我也没试过,我只是最近突然明白BCB的好处了,正在犹豫下一个项目要不要用它来做。麻烦你多指教一二。尤其是最近在github上开了眼界,C++类库之繁多,真是昏倒。
----------------------------------------------
只有偏执狂才能生存!
作者:
2018/2/20 6:49:18
7楼:
头一次听说,只要在C十十源代码函数名前加下划线即可以进行调用,没有相关知识,无法评判。 摘取第三方源码,可能耗费甚多,著名的开源库类型众多,耦合性强,需明晰源码实现功能,才能正确摘取。 奉劝一句:如果是小型项目,BCB自带库或C++标准库能实现大部分功能,适宜使用BCB进行开发;如果涉及音频、视频、高性能计算、专业性较强的密集型计算、机器学习、深度学习等功能,需使用第三方库、非VCL所长时,不适宜使用BCB进行开发,如果开发者能力强,另当别论。当然只是自己的看法,仅供参考。
----------------------------------------------
-
作者:
mmygod (mmygod)
★☆☆☆☆
-
盒子活跃会员
2018/2/20 18:37:19
8楼:
nevergrief 讲的有理, 没往这一方面去想
----------------------------------------------
-