C ++ Builder 6中的IntToStr函数和C ++ Builder Seattle有什么区别?

问题描述 投票:2回答:3

我可以在C ++ Builder 6中成功编译以下代码段,但不能在西雅图RAD Studio中编译它:

  unsigned long x = 50;
  String s = IntToStr(x);

[[bcc32错误] Unit1.cpp(55):E2015'_fastcall之间的歧义System :: Sysutils :: IntToStr(int)位于c:\ program文件(x86)\ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ System.SysUtils.hpp:3182'和'_fastcall System :: Sysutils :: IntToStr(__ int64)在c:\ program文件(x86)\ embarcadero \ studio \ 17.0 \ include \ windows \ rtl \ System.SysUtils.hpp:3183'

我检查了IntToStr的定义。

C ++ Builder 6:

extern PACKAGE AnsiString __fastcall IntToStr(int Value)/* overload */;
extern PACKAGE AnsiString __fastcall IntToStr(__int64 Value)/* overload */;

C ++ Builder Seattle:

extern DELPHI_PACKAGE System::UnicodeString __fastcall IntToStr(int Value)/* overload */;
extern DELPHI_PACKAGE System::UnicodeString __fastcall IntToStr(__int64 Value)/* overload */;
extern DELPHI_PACKAGE System::UnicodeString __fastcall UIntToStr(unsigned Value)/* overload */;
extern DELPHI_PACKAGE System::UnicodeString __fastcall UIntToStr(unsigned __int64 Value)/* overload */;

[C ++ Builder 6和C ++ Builder Seattle有什么区别?

c++builder c++builder-10-seattle
3个回答
3
投票

基本上在这种情况下,存在歧义,这意味着IntToStr有两个重载,期望使用不同的参数类型(intint64)。歧义是将提供的long类型降级为int或将其升级为int64。在此,该参数应为cast-ed最匹配的类型。


2
投票

除了@Ali Kazmi所说的以外,对于未签名,您需要使用最后2个值之一,因为您的值是未签名的:

UIntToStr()

我认为这样就不需要您强制转换值,而是应该编译它。

Builder 6将未签名的值隐式转换为已签名类型之一,新的Builders(自2010年起)默认情况下不这样做,您需要将其显式转换为已签名类型或使用未签名的替代方法


-1
投票

通过使用强大的UnicodeString类本身的重载构造函数之一,您可以降低为每种变量类型找到正确的转换器函数的复杂性(就像您在Delphi中所做的那样,例如:

unsigned long x = 50;
String s(x);

此外,您可以在代码中的任何地方编写String(MyVariableName,以获得MyVariableName的UnicodeString表示形式。

在较旧的CBuilder版本中,StringAnsiString的typedef。如今,它是UnicodeString的typedef。

© www.soinside.com 2019 - 2024. All rights reserved.