【问题标题】:What is the difference between the IntToStr function in C++Builder 6 and C++Builder Seattle?C++Builder 6 和 C++Builder Seattle 中的 IntToStr 函数有什么区别?
【发布时间】:2016-02-06 05:22:46
【问题描述】:

我可以在 C++Builder 6 中成功编译以下代码 sn-p,但在 RAD Studio Seattle 中无法编译:

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

[bcc32 错误] Unit1.cpp(55): E2015 Ambiguity between '_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 西雅图:

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


    【解决方案1】:

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

    【讨论】:

    • 我知道 IntToStr 方法是重载和不同的参数类型。但我想知道 c++ builder 6 和 c++ builder seatle 之间的区别。
    • Builder 6 将无符号值隐式转换为有符号类型之一,新的 Builders(自 2010 年以来)默认情况下不会这样做,您需要将其显式转换为有符号类型或使用无符号替代方案.
    • 如果此解决方案有效,请不要忘记投票并标记为答案
    【解决方案2】:

    除了@Ali Kazmi 所说的,对于无符号,您需要使用最后两个之一,因为您的值是无符号的:

    UIntToStr()
    

    我认为它不需要你转换值并且它应该编译。

    Builder 6 将无符号值隐式转换为有符号类型之一,新的 Builders(自 2010 年以来)默认情况下不这样做,您需要将其显式转换为有符号类型或使用无符号替代项

    【讨论】:

    • unsigned long x = 50; String s = UIntToStr(x); 无法编译。我发现了 ULongToChar 方法。但我想长字符串
    • 要寻找的另一件事是,在 Builder 6 中,所有内容都是 AnsiStringString 被定义为它,确保 String 当前是什么。也许它仍然是AnsiString,然后你需要UnicodeString s = UIntToStr(x);
    【解决方案3】:

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

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

    此外,您可以在代码中的任何位置编写 String(MyVariableName) 以获得 MyVariableName 的 UnicodeString 表示。

    在较早的 CBuilder 版本中,StringAnsiString 的 typedef。 现在,它是 UnicodeString 的 typedef。

    【讨论】:

    • 虽然是这样,但这并不能回答所提出的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2015-12-03
    • 2011-03-27
    • 2016-01-20
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多