Бесконечность в модуле Delphi преобразуется в +INF в файле .hpp

Я использую 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?

@David Если я напишу double X = Infinity, Y = HUGE_VAL;, сравнение (X == Y) даст true. И X, и Y содержат значение 0x7FF0000000000000.

Martin Nijhoff 24.03.2022 10:49

О, тогда я ошибаюсь, извините

David Heffernan 24.03.2022 11:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

How do I get the compiler to output Infinity (or HUGE_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 ...}. Большое спасибо, Реми. Я очень ценю ваши постоянные усилия.

Martin Nijhoff 25.03.2022 08:42

Другие вопросы по теме