Delphi单元中的Infinity被翻译为.hpp文件中的+INF



我使用C++Builder XE6,并编写了以下Delphi单元:

unit JSONUtils;
interface
uses
System.JSON, System.Math;
function GetJSONDouble (Value: TJSONValue; Path: string; Default: Double = Infinity): Double;
implementation
function GetJSONDouble (Value: TJSONValue; Path: string; Default: Double): Double;
begin
Result := Value.GetValue<Double>(Path, Default);
end;
end.

编译时,会生成以下.hpp文件:

// CodeGear C++Builder
// Copyright (c) 1995, 2014 by Embarcadero Technologies, Inc.
// All rights reserved
// (DO NOT EDIT: machine generated header) 'JSONUtils.pas' rev: 27.00 (Windows)
#ifndef JsonutilsHPP
#define JsonutilsHPP
#pragma delphiheader begin
#pragma option push
#pragma option -w-      // All warnings off
#pragma option -Vx      // Zero-length empty class member 
#pragma pack(push,8)
#include <System.hpp>   // Pascal unit
#include <SysInit.hpp>  // Pascal unit
#include <System.JSON.hpp>  // Pascal unit
#include <System.Math.hpp>  // Pascal unit
//-- user supplied -----------------------------------------------------------
namespace Jsonutils
{
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern DELPHI_PACKAGE double __fastcall GetJSONDouble(System::Json::TJSONValue* Value, System::UnicodeString Path, double Default = +INF);
}   /* namespace Jsonutils */
#if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_JSONUTILS)
using namespace Jsonutils;
#endif
#pragma pack(pop)
#pragma option pop
#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif  // JsonutilsHPP

注意,.pas文件中Infinity的默认值被转换为.hpp文件中的+INF

当我在C++单元中包含.hpp文件时,我会得到以下编译器错误:

[bcc32 Error] JSONUtils.hpp(26): E2451 Undefined symbol 'INF'

可以理解,因为System.Math.hpp中没有定义INF,但Infinity是.

如何让编译器将Infinity(或HUGE_VAL(输出到.hpp文件而不是+INF

如何让编译器将Infinity(或HUGE_VAL(输出到.hpp文件而不是+INF

AFAIK,你没有。这就是Delphi编译器选择将Infinity翻译成C++的简单方式。请随时向Embarcadero提交有关它的错误报告。

同时,作为一种变通方法,您可以尝试用{$NODEFINE}{$EXTERNALSYM}声明GetJSONDouble,以避免Delphi编译器在.hpp中输出默认声明,然后使用{$HPPEMIT}自己声明GetJSONDouble(),例如:

unit JSONUtils;
interface
uses
System.JSON, System.Math;
{$EXTERNALSYM GetJSONDouble}
function GetJSONDouble (Value: TJSONValue; Path: string; Default: Double = Infinity): Double;
{$HPPEMIT OPENNAMESPACE}
{$HPPEMIT 'extern DELPHI_PACKAGE double __fastcall GetJSONDouble(System::Json::TJSONValue* Value, System::UnicodeString Path, double Default = System::Math::Infinity);'}
{$HPPEMIT CLOSENAMESPACE}
implementation
function GetJSONDouble (Value: TJSONValue; Path: string; Default: Double): Double;
begin
Result := Value.GetValue<Double>(Path, Default);
end;
end.

相关内容

  • 没有找到相关文章

最新更新