Delphi 单位中的无穷大被转换为 .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
请注意 .pasInfinity
的默认值code> 文件被转换为 .hpp
文件中的 +INF
。
当我在 C++ 单元中包含 .hpp
文件时,出现以下编译器错误:
[bcc32 Error] JSONUtils.hpp(26): E2451 Undefined symbol 'INF'
可以理解,因为 INF
未在 System.Math.hpp< 中定义/code>,但
Infinity
是。
如何让编译器将 Infinity
(或 HUGE_VAL
)输出到 .hpp
文件而不是 +INF
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
AFAIK,你不知道。这就是 Delphi 编译器选择将
Infinity
翻译为 C++ 的方式。请随时向 Embarcadero 提交错误报告。同时,作为一种解决方法,您可以尝试使用 GetJSONDouble “nofollow noreferrer”>
{$NODEFINE}
或{$EXTERNALSYM}
以避免 Delphi 编译器在.hpp
中输出默认声明,然后使用{$HPPEMIT}
声明GetJSONDouble ()
自己,例如:AFAIK, you don't. That is simply how the Delphi compiler chose to translate
Infinity
for C++. Feel free to submit a bug report to Embarcadero about it.In the meantime, as a workaround, what you could try instead is declaring
GetJSONDouble
with{$NODEFINE}
or{$EXTERNALSYM}
to avoid the Delphi compiler from outputting a default declaration in the.hpp
, and then use{$HPPEMIT}
to declareGetJSONDouble()
yourself, eg: