Я использую 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
Обратите внимание, что значение по умолчанию Infinity
в файле .pas
преобразуется в +INF
в файле .hpp
.
Когда я включаю файл .hpp
в модуль C++, я получаю следующую ошибку компилятора:
[bcc32 Error] JSONUtils.hpp(26): E2451 Undefined symbol 'INF'
Понятно, потому что INF
не определяется в System.Math.hpp
, а Infinity
есть.
Как заставить компилятор выводить Infinity
(или HUGE_VAL
) в файл .hpp
вместо +INF
?
О, тогда я ошибаюсь, извините
How do I get the compiler to output
Infinity
(orHUGE_VAL
) to the.hpp
file instead of+INF
?
AFAIK, вы не знаете. Именно так компилятор Delphi решил перевести Infinity
для C++. Не стесняйтесь сообщить об этом отправить отчет об ошибке в Embarcadero.
В то же время, в качестве обходного пути, вместо этого вы можете попробовать объявить GetJSONDouble
с помощью {$NODEFINE}
или {$EXTERNALSYM}
, чтобы компилятор 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.
Это сделало трюк! Я знал о {$HPPEMIT '...'}
, но как-то пропустил {$NODEFINE}
и {$EXTERNALSYM ...}
. Большое спасибо, Реми. Я очень ценю ваши постоянные усилия.
@David Если я напишу
double X = Infinity, Y = HUGE_VAL;
, сравнение(X == Y)
дастtrue
. И X, и Y содержат значение0x7FF0000000000000
.